diff options
author | randomdan <randomdan@localhost> | 2011-11-02 16:39:12 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2011-11-02 16:39:12 +0000 |
commit | bc034e852ebd75557418668fa946eca55cfb4958 (patch) | |
tree | a33de1084a8f2e9b04a4111905df6d249fabed65 /project2/common/variableConvert.cpp | |
parent | Finally sort the stupid names problem in the XML lib and remove xmlMemCache f... (diff) | |
download | project2-bc034e852ebd75557418668fa946eca55cfb4958.tar.bz2 project2-bc034e852ebd75557418668fa946eca55cfb4958.tar.xz project2-bc034e852ebd75557418668fa946eca55cfb4958.zip |
Make many things use variables instead of preread values
Add support for a Boolean type
Fix flow error in exception handling
Diffstat (limited to 'project2/common/variableConvert.cpp')
-rw-r--r-- | project2/common/variableConvert.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/project2/common/variableConvert.cpp b/project2/common/variableConvert.cpp index f0e42c9..7eb16cf 100644 --- a/project2/common/variableConvert.cpp +++ b/project2/common/variableConvert.cpp @@ -121,7 +121,7 @@ class ConvertVisitorUCharStar : public boost::static_visitor<const unsigned char private: const VariableType * var; }; -// Convert to generic type +// Convert to numeric type template <typename DestType> class ConvertVisitor : public boost::static_visitor<DestType> { public: @@ -136,6 +136,9 @@ class ConvertVisitor : public boost::static_visitor<DestType> { DestType operator()(const Null &) const { throw NullVariable(); } + DestType operator()(const Boolean & b) const { + return b.value ? 1 : 0; + } template <typename T> DestType operator()(const T & r) const { return boost::numeric_cast<DestType>(r); @@ -164,6 +167,30 @@ class ConvertVisitorDateTime : public boost::static_visitor<const boost::posix_t private: const VariableType * var; }; +// Convert to boolean +class ConvertVisitorBool : public boost::static_visitor<bool> { + public: + ConvertVisitorBool(const VariableType * v) : var(v) { + } + bool operator()(const Glib::ustring & s) const { + const char * str = s.c_str(); + if (strcasecmp(str, "true") == 0 || strcasecmp(str, "yes") == 0 || strcasecmp(str, "on") == 0) return true; + if (strcasecmp(str, "false") == 0 || strcasecmp(str, "no") == 0 || strcasecmp(str, "off") == 0) return false; + throw InvalidConversionTo("bool"); + } + bool operator()(const boost::posix_time::ptime &) const { + throw InvalidConversionTo("bool"); + } + bool operator()(const Null &) const { + throw NullVariable(); + } + template <typename T> + bool operator()(const T & t) const { + return (t != 0); + } + private: + const VariableType * var; +}; VariableType::operator const Glib::ustring &() const { return boost::apply_visitor(ConvertVisitorGlibUstring(this), *this); @@ -196,3 +223,7 @@ VariableType::operator const boost::posix_time::ptime &() const { return boost::apply_visitor(ConvertVisitorDateTime(this), *this); } +VariableType::operator bool() const +{ + return boost::apply_visitor(ConvertVisitorBool(this), *this); +} |