summaryrefslogtreecommitdiff
path: root/boost/spirit/home/support/extended_variant.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/spirit/home/support/extended_variant.hpp')
-rw-r--r--boost/spirit/home/support/extended_variant.hpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/boost/spirit/home/support/extended_variant.hpp b/boost/spirit/home/support/extended_variant.hpp
index d23ca3d8b2..4d3ae599d6 100644
--- a/boost/spirit/home/support/extended_variant.hpp
+++ b/boost/spirit/home/support/extended_variant.hpp
@@ -29,19 +29,24 @@
///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit
{
+#if defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
template <
BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
- BOOST_VARIANT_LIMIT_TYPES,
+ BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES,
typename T, boost::detail::variant::void_)
// We should not be depending on detail::variant::void_
// but I'm not sure if this can fixed. Any other way is
// clumsy at best.
>
+#else
+ template <typename... Types>
+#endif
struct extended_variant
{
// tell spirit that this is an adapted variant
struct adapted_variant_tag;
+#if defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
typedef boost::variant<
BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)>
variant_type;
@@ -50,6 +55,11 @@ namespace boost { namespace spirit
typedef extended_variant<
BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)
> base_type;
+#else
+ typedef boost::variant<Types...> variant_type;
+ typedef typename variant_type::types types;
+ typedef extended_variant<Types...> base_type;
+#endif
extended_variant() : var() {}
@@ -101,6 +111,7 @@ namespace boost { namespace spirit
namespace boost
{
+#if defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
template <typename T, BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(typename T)>
inline T const&
get(boost::spirit::extended_variant<
@@ -132,6 +143,35 @@ namespace boost
{
return boost::get<T>(&x->get());
}
+#else
+ template <typename T, typename... Types>
+ inline T const&
+ get(boost::spirit::extended_variant<Types...> const& x)
+ {
+ return boost::get<T>(x.get());
+ }
+
+ template <typename T, typename... Types>
+ inline T&
+ get(boost::spirit::extended_variant<Types...>& x)
+ {
+ return boost::get<T>(x.get());
+ }
+
+ template <typename T, typename... Types>
+ inline T const*
+ get(boost::spirit::extended_variant<Types...> const* x)
+ {
+ return boost::get<T>(&x->get());
+ }
+
+ template <typename T, typename... Types>
+ inline T*
+ get(boost::spirit::extended_variant<Types...>* x)
+ {
+ return boost::get<T>(&x->get());
+ }
+#endif
}
#undef BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS