Skip to content
Snippets Groups Projects
variables.cpp 1.59 KiB
Newer Older
#include <boost/mpl/always.hpp>
#include <boost/mpl/pop_front.hpp>
namespace {
struct delhelper
	Variables& v;
	const std::string& s;
	bool& r;
	delhelper(Variables& v, const std::string& s, bool& r): v(v), s(s), r(r) {}

	template<typename T>
	void operator()(const boost::mpl::always<T>&) {
		r = v.del<T>(s) || r;
	}
};
	Variables& v;
	const std::string& s;
	bool& rv;
	const boost::shared_ptr<Value>& p;
	puthelper(Variables& v, const std::string& s, bool& rv,
		const boost::shared_ptr<Value>& p): v(v), s(s), rv(rv), p(p) {}

	template<typename T>
	void operator()(const boost::mpl::always<T>&) {
		if (rv) return;
		boost::shared_ptr<T> t = boost::dynamic_pointer_cast<T>(p);
		if (t) {
			rv = true;
			v.put(s, t);
		}
};

} /* end anon ns */

bool Variables::del_any(const std::string &s)
{
	bool rv = false;
	typedef boost::mpl::pop_front< types >::type concrete;
	// call delhelper::operator()<T> once for each of the allowed
	// Value subtypes (but not for Value itself).
	boost::mpl::for_each<concrete, boost::mpl::always<boost::mpl::_1> >(
		delhelper(*this, s, rv));
	return rv;
void Variables::put_any(const std::string &s, const boost::shared_ptr<Value> &v)
	bool rv = false;
	typedef boost::mpl::pop_front< types >::type concrete;
	// call puthelper::operator()<T> once for each of the allowed
	// Value subtypes (but not for Value itself).
	boost::mpl::for_each<concrete, boost::mpl::always<boost::mpl::_1> >(
		puthelper(*this, s, rv, v));
	if (!rv) throw VariableTypeMismatch(s);