#include <libwccl/variables.h> #include <boost/mpl/always.hpp> #include <boost/mpl/pop_front.hpp> namespace Wccl { Variables::Variables() { } 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; } }; struct puthelper { 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); } } /* end ns Wccl */