Skip to content
Snippets Groups Projects
Select Git revision
  • 9b51ebe7e62a46c9b7c39818719920bb23949955
  • master default protected
  • fix-words-ann
  • wccl-rules-migration
  • develop
5 results

variables.cpp

Blame
  • variables.cpp 1.59 KiB
    #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 */