diff options
Diffstat (limited to 'boost/spirit/home/support/extended_variant.hpp')
-rw-r--r-- | boost/spirit/home/support/extended_variant.hpp | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/boost/spirit/home/support/extended_variant.hpp b/boost/spirit/home/support/extended_variant.hpp index 0a9613ba65..d23ca3d8b2 100644 --- a/boost/spirit/home/support/extended_variant.hpp +++ b/boost/spirit/home/support/extended_variant.hpp @@ -12,8 +12,20 @@ #endif #include <boost/variant.hpp> +#include <boost/mpl/limits/list.hpp> +#include <boost/preprocessor/repetition/enum_params.hpp> #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp> +#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) +#define BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES BOOST_MPL_LIMIT_LIST_SIZE +#else +#define BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES BOOST_VARIANT_LIMIT_TYPES +#endif + +#define BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T) \ + BOOST_PP_ENUM_PARAMS(BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES, T) \ + /**/ + /////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { @@ -31,11 +43,13 @@ namespace boost { namespace spirit struct adapted_variant_tag; typedef boost::variant< - BOOST_VARIANT_ENUM_PARAMS(T)> + BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)> variant_type; typedef typename variant_type::types types; - typedef extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)> base_type; + typedef extended_variant< + BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T) + > base_type; extended_variant() : var() {} @@ -43,6 +57,10 @@ namespace boost { namespace spirit extended_variant(T const& var) : var(var) {} + template <typename T> + extended_variant(T& var) + : var(var) {} + template <typename F> typename F::result_type apply_visitor(F const& v) { @@ -83,33 +101,40 @@ namespace boost { namespace spirit namespace boost { - template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)> + template <typename T, BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(typename T)> inline T const& - get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& x) + get(boost::spirit::extended_variant< + BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)> const& x) { return boost::get<T>(x.get()); } - template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)> + template <typename T, BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(typename T)> inline T& - get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)>& x) + get(boost::spirit::extended_variant< + BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)>& x) { return boost::get<T>(x.get()); } - template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)> + template <typename T, BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(typename T)> inline T const* - get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)> const* x) + get(boost::spirit::extended_variant< + BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)> const* x) { return boost::get<T>(&x->get()); } - template <typename T, BOOST_VARIANT_ENUM_PARAMS(typename T)> + template <typename T, BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(typename T)> inline T* - get(boost::spirit::extended_variant<BOOST_VARIANT_ENUM_PARAMS(T)>* x) + get(boost::spirit::extended_variant< + BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)>* x) { return boost::get<T>(&x->get()); } } +#undef BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS +#undef BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES + #endif |