diff --git a/include/mstch/mstch.hpp b/include/mstch/mstch.hpp index 20c4099..cba5206 100644 --- a/include/mstch/mstch.hpp +++ b/include/mstch/mstch.hpp @@ -16,6 +16,23 @@ struct config { namespace internal { +template +class dynamic_t { + public: + virtual ~dynamic_t() = default; + const N& at (const std::string& name) const { + cache = this->get_value(name); + return cache; + } + bool has(const std::string& name) const { + return this->has_value(name); + } + private: + virtual N get_value(const std::string& name) const = 0; + virtual bool has_value(const std::string& name) const = 0; + mutable N cache; +}; + template class object_t { public: @@ -97,9 +114,11 @@ using node = boost::make_recursive_variant< std::nullptr_t, std::string, int, double, bool, internal::lambda_t, std::shared_ptr>, + std::shared_ptr>, std::map, std::vector>::type; using object = internal::object_t; +using dynamic = internal::dynamic_t; using lambda = internal::lambda_t; using map = std::map; using array = std::vector; diff --git a/src/visitor/get_token.hpp b/src/visitor/get_token.hpp index d41ab6e..b7fbb88 100644 --- a/src/visitor/get_token.hpp +++ b/src/visitor/get_token.hpp @@ -27,6 +27,10 @@ class get_token: public boost::static_visitor { return object->at(m_token); } + const mstch::node& operator()(const std::shared_ptr& object) const { + return object->at(m_token); + } + private: const std::string& m_token; const mstch::node& m_node; diff --git a/src/visitor/has_token.hpp b/src/visitor/has_token.hpp index 5ab30d4..f846009 100644 --- a/src/visitor/has_token.hpp +++ b/src/visitor/has_token.hpp @@ -24,6 +24,10 @@ class has_token: public boost::static_visitor { return object->has(m_token); } + bool operator()(const std::shared_ptr& object) const { + return object->has(m_token); + } + private: const std::string& m_token; };