diff options
| -rw-r--r-- | project2/variableConvert.cpp | 64 | ||||
| -rw-r--r-- | project2/variables.h | 1 | 
2 files changed, 22 insertions, 43 deletions
diff --git a/project2/variableConvert.cpp b/project2/variableConvert.cpp index 8797ef7..ea6ddef 100644 --- a/project2/variableConvert.cpp +++ b/project2/variableConvert.cpp @@ -145,56 +145,30 @@ class ConvertVisitorUCharStar : public boost::static_visitor<const unsigned char  	private:  		const VariableType * var;  }; -// Convert to int64_t -class ConvertVisitorInt : public boost::static_visitor<int64_t> { +// Convert to generic type +template <typename DestType> +class ConvertVisitor : public boost::static_visitor<DestType> {  	public: -		ConvertVisitorInt(const VariableType * v) : var(v) { +		ConvertVisitor(const VariableType * v) : var(v) {  		} -		int64_t operator()(const Glib::ustring & r) const { -			return boost::lexical_cast<int64_t>(r); +		DestType operator()(const Glib::ustring & r) const { +			return boost::lexical_cast<DestType>(r);  		} -		int64_t operator()(const boost::shared_ptr<const Glib::ustring> & r) const { -			return boost::lexical_cast<int64_t>(*r); +		DestType operator()(const boost::shared_ptr<const Glib::ustring> & r) const { +			return boost::lexical_cast<DestType>(*r);  		} -		int64_t operator()(const boost::posix_time::ptime &) const { -			throw InvalidConversionTo("Integer"); +		DestType operator()(const boost::posix_time::ptime &) const { +			throw InvalidConversionTo(typeid(DestType).name());  		} -		int64_t operator()(const boost::shared_ptr<const boost::posix_time::ptime> &) const { -			throw InvalidConversionTo("Integer"); +		DestType operator()(const boost::shared_ptr<const boost::posix_time::ptime> &) const { +			throw InvalidConversionTo(typeid(DestType).name());  		} -		int64_t operator()(const Null &) const { +		DestType operator()(const Null &) const {  			throw NullVariable();  		}  		template <typename T> -		int64_t operator()(const T & r) const { -			return boost::numeric_cast<int64_t>(r); -		} -	private: -		const VariableType * var; -}; -// Convert to double -class ConvertVisitorDouble : public boost::static_visitor<double> { -	public: -		ConvertVisitorDouble(const VariableType * v) : var(v) { -		} -		double operator()(const Glib::ustring & r) const { -			return boost::lexical_cast<double>(r); -		} -		double operator()(const boost::shared_ptr<const Glib::ustring> & r) const { -			return boost::lexical_cast<double>(*r); -		} -		double operator()(const boost::posix_time::ptime &) const { -			throw InvalidConversionTo("Floating point"); -		} -		double operator()(const boost::shared_ptr<const boost::posix_time::ptime> &) const { -			throw InvalidConversionTo("Floating point"); -		} -		double operator()(const Null &) const { -			throw NullVariable(); -		} -		template <typename T> -		double operator()(const T & r) const { -			return boost::numeric_cast<double>(r); +		DestType operator()(const T & r) const { +			return boost::numeric_cast<DestType>(r);  		}  	private:  		const VariableType * var; @@ -242,13 +216,17 @@ VariableType::operator const unsigned char *() const  {  	return boost::apply_visitor(ConvertVisitorUCharStar(this), *this);  } +VariableType::operator int32_t() const +{ +	return boost::apply_visitor(ConvertVisitor<int32_t>(this), *this); +}  VariableType::operator int64_t() const  { -	return boost::apply_visitor(ConvertVisitorInt(this), *this); +	return boost::apply_visitor(ConvertVisitor<int64_t>(this), *this);  }  VariableType::operator double() const  { -	return boost::apply_visitor(ConvertVisitorDouble(this), *this); +	return boost::apply_visitor(ConvertVisitor<double>(this), *this);  }  VariableType::operator const boost::posix_time::ptime &() const  { diff --git a/project2/variables.h b/project2/variables.h index 863355c..5e29547 100644 --- a/project2/variables.h +++ b/project2/variables.h @@ -50,6 +50,7 @@ class VariableType : public _VT {  		operator const char *() const;  		operator const unsigned char *() const;  		operator int64_t() const; +		operator int32_t() const;  		operator double() const;  		operator const boost::posix_time::ptime &() const;  | 
