ifndef Rice__Arguments__hpp_ define Rice__Arguments__hpp_
include “../Arg_impl.hpp” include <sstream> include <vector> include “../to_from_ruby_defn.hpp”
namespace Rice {
class Arguments
{
public:
Arguments() {
required_ = 0;
optional_ = 0;
}
~Arguments() {
}
Get the full argument count of this
list of arguments.
Returns -1 no defined arguments
int count() {
if(required_ == 0 && optional_ == 0) {
return -1;
} else {
return required_ + optional_;
}
}
Get the rb_scan_args format string for this
list of arguments.
In the case of no Args (default case), this
method uses the passed in full argument count
/
std::string formatString(int fullArgCount)
{
std::stringstream s;
if(required_ == 0 && optional_ == 0)
{
s << fullArgCount << 0;
}
else
{
s << required_ << optional_;
}
return s.str();
}
/**
Add a defined Arg to this list of Arguments
/
void add(const Arg& arg)
{
args_.push_back(arg);
if(arg.hasDefaultValue())
{
optional_++;
}
else
{
required_++;
}
}
/**
Is the argument at the request location an optional
argument?
/
bool isOptional(unsigned int pos)
{
if(required_ == 0 && optional_ == 0)
{
return false;
}
if(pos >= args_.size())
{
return false;
}
return args_[pos].hasDefaultValue();
}
/**
Given a position, a type, and a ruby VALUE, figure out
what argument value we need to return according to
defaults and if that VALUE is nil or not
/
template<typename Arg_T>
Arg_T getArgumentOrDefault(int pos, VALUE in)
{
if(isOptional(pos) && NIL_P(in))
{
return args_[pos].getDefaultValue<Arg_T>();
}
else
{
return from_ruby<Arg_T>(in);
}
}
private:
std::vector<Arg> args_;
/** Keep counts of required and optional parameters
int required_;
int optional_;
};
}
endif // Rice__Arguments__hpp_