ladanyi@201: #include "map_value.h" ladanyi@201: #include ladanyi@201: #include ladanyi@201: ladanyi@201: MapValue::MapValue() ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: has_value = false; ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::MapValue(double d) ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: p_value = new double(d); ladanyi@201: type = NUMERIC; ladanyi@201: has_value = true; ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::MapValue(std::string str) ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: p_value = new std::string(str); ladanyi@201: type = STRING; ladanyi@201: has_value = true; ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::MapValue(const char* str) ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: p_value = new std::string(str); ladanyi@201: type = STRING; ladanyi@201: has_value = true; ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::operator double() const ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: if (!has_value) throw IllegalOperation(); ladanyi@201: if (type == NUMERIC) ladanyi@201: return *(static_cast(p_value)); ladanyi@201: else ladanyi@201: throw IllegalOperation(); ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::operator std::string() const ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: if (!has_value) throw IllegalOperation(); ladanyi@201: std::string ret; ladanyi@201: switch (type) ladanyi@201: { ladanyi@201: case NUMERIC: ladanyi@201: { ladanyi@201: double d = *(static_cast(p_value)); ladanyi@201: std::ostringstream ostr; ladanyi@201: ostr << d; ladanyi@201: ret = ostr.str(); ladanyi@201: } ladanyi@201: break; ladanyi@201: case STRING: ladanyi@201: ret = *(static_cast(p_value)); ladanyi@201: break; ladanyi@201: } ladanyi@201: return ret; ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::MapValue(const MapValue& v) ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: if (!v.has_value) throw IllegalOperation(); ladanyi@201: has_value = true; ladanyi@201: type = v.type; ladanyi@201: switch (v.type) ladanyi@201: { ladanyi@201: case NUMERIC: ladanyi@201: p_value = new double(*(static_cast(v.p_value))); ladanyi@201: break; ladanyi@201: case STRING: ladanyi@201: p_value = new std::string(*(static_cast(v.p_value))); ladanyi@201: break; ladanyi@201: } ladanyi@201: } ladanyi@201: ladanyi@201: MapValue& MapValue::operator=(const MapValue& v) ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: if (&v != this) ladanyi@201: { ladanyi@201: if (!v.has_value) throw IllegalOperation(); ladanyi@201: clear(); ladanyi@201: has_value = true; ladanyi@201: type = v.type; ladanyi@201: switch (v.type) ladanyi@201: { ladanyi@201: case NUMERIC: ladanyi@201: p_value = new double(*(static_cast(v.p_value))); ladanyi@201: break; ladanyi@201: case STRING: ladanyi@201: p_value = new std::string(*(static_cast(v.p_value))); ladanyi@201: break; ladanyi@201: } ladanyi@201: } ladanyi@201: return *this; ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::~MapValue() ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: clear(); ladanyi@201: } ladanyi@201: ladanyi@201: void MapValue::clear() ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: if (!has_value) return; ladanyi@201: switch (type) ladanyi@201: { ladanyi@201: case NUMERIC: ladanyi@201: delete static_cast(p_value); ladanyi@201: break; ladanyi@201: case STRING: ladanyi@201: delete static_cast(p_value); ladanyi@201: break; ladanyi@201: } ladanyi@201: } ladanyi@201: ladanyi@201: MapValue::Type MapValue::getType() const ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: return type; ladanyi@201: } ladanyi@201: ladanyi@201: bool MapValue::hasValue() const ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: return has_value; ladanyi@201: } ladanyi@201: ladanyi@201: std::ostream& operator<<(std::ostream &os, const MapValue& v) ladanyi@201: { ladanyi@201: //std::cout << __PRETTY_FUNCTION__ << std::endl; ladanyi@201: if (!v.has_value) return os; ladanyi@201: switch (v.type) ladanyi@201: { ladanyi@201: case MapValue::NUMERIC: ladanyi@201: os << *(static_cast(v.p_value)); ladanyi@201: break; ladanyi@201: case MapValue::STRING: ladanyi@201: os << *(static_cast(v.p_value)); ladanyi@201: break; ladanyi@201: } ladanyi@201: return os; ladanyi@201: }