The complete source code of IdealIRC http://www.idealirc.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
idealirc/Script/ValueExtract.cpp

77 lines
1.6 KiB

#include "ValueExtract.h"
namespace {
std::string emptyString;
ValueArray emptyArray;
}
ValueExtract::ValueExtract(ValueHolder& val)
: value(val)
{}
bool ValueExtract::isVoid() const
{
return value.getType() == ValueHolder::Type::Void;
}
int ValueExtract::toInt() const
{
if (value.getType() == ValueHolder::Type::Integer)
return std::get<int>(*value.mval());
if (value.getType() == ValueHolder::Type::Real)
return static_cast<int>(std::get<double>(*value.mval()));
if (value.getType() == ValueHolder::Type::Bool)
return std::get<bool>(*value.mval());
return 0;
}
double ValueExtract::toReal() const
{
if (value.getType() == ValueHolder::Type::Integer)
return std::get<int>(*value.mval());
if (value.getType() == ValueHolder::Type::Real)
return std::get<double>(*value.mval());
if (value.getType() == ValueHolder::Type::Bool)
return std::get<bool>(*value.mval());
return 0;
}
bool ValueExtract::toBool() const
{
if (value.getType() == ValueHolder::Type::Integer)
return std::get<int>(*value.mval()) != 0;
if (value.getType() == ValueHolder::Type::Real) {
auto v = std::get<double>(*value.mval());
return (v < 0) || (v > 0); // TODO use some epsilon value instead
}
if (value.getType() == ValueHolder::Type::Bool)
return std::get<bool>(*value.mval());
return false;
}
std::string& ValueExtract::toString()
{
if (value.getType() == ValueHolder::Type::String)
return std::get<std::string>(*value.mval());
emptyString.clear();
return emptyString;
}
ValueArray& ValueExtract::toMap()
{
if (value.getType() == ValueHolder::Type::Map)
return std::get<ValueArray>(*value.mval());
emptyArray.clear();
return emptyArray;
}