Newer
Older
ilor
committed
#include <libwccl/variables.h>
#include <boost/mpl/always.hpp>
#include <boost/mpl/pop_front.hpp>
ilor
committed
namespace Wccl {
Variables::Variables()
{
}
namespace {
struct delhelper
ilor
committed
{
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;
}
};
ilor
committed
ilor
committed
{
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);
}
ilor
committed
}
};
} /* 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;
ilor
committed
}
void Variables::put_any(const std::string &s, const boost::shared_ptr<Value> &v)
ilor
committed
{
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);
ilor
committed
}
} /* end ns Wccl */