Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(BOOST_SPIRIT_EXTENDED_VARIANT_AUGUST_6_2011_0859AM) Chris@16: #define BOOST_SPIRIT_EXTENDED_VARIANT_AUGUST_6_2011_0859AM Chris@16: Chris@16: #if defined(_MSC_VER) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@101: #include Chris@101: #include Chris@16: #include Chris@16: Chris@101: #if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) Chris@101: #define BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES BOOST_MPL_LIMIT_LIST_SIZE Chris@101: #else Chris@101: #define BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES BOOST_VARIANT_LIMIT_TYPES Chris@101: #endif Chris@101: Chris@101: #define BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T) \ Chris@101: BOOST_PP_ENUM_PARAMS(BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES, T) \ Chris@101: /**/ Chris@101: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { namespace spirit Chris@16: { Chris@16: template < Chris@16: BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( Chris@16: BOOST_VARIANT_LIMIT_TYPES, Chris@16: typename T, boost::detail::variant::void_) Chris@16: // We should not be depending on detail::variant::void_ Chris@16: // but I'm not sure if this can fixed. Any other way is Chris@16: // clumsy at best. Chris@16: > Chris@16: struct extended_variant Chris@16: { Chris@16: // tell spirit that this is an adapted variant Chris@16: struct adapted_variant_tag; Chris@16: Chris@16: typedef boost::variant< Chris@101: BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)> Chris@16: variant_type; Chris@16: typedef typename variant_type::types types; Chris@16: Chris@101: typedef extended_variant< Chris@101: BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T) Chris@101: > base_type; Chris@16: Chris@16: extended_variant() : var() {} Chris@16: Chris@16: template Chris@16: extended_variant(T const& var) Chris@16: : var(var) {} Chris@16: Chris@16: template Chris@16: extended_variant(T& var) Chris@16: : var(var) {} Chris@16: Chris@16: template Chris@16: typename F::result_type apply_visitor(F const& v) Chris@16: { Chris@16: return var.apply_visitor(v); Chris@16: } Chris@16: Chris@16: template Chris@16: typename F::result_type apply_visitor(F const& v) const Chris@16: { Chris@16: return var.apply_visitor(v); Chris@16: } Chris@16: Chris@16: template Chris@16: typename F::result_type apply_visitor(F& v) Chris@16: { Chris@16: return var.apply_visitor(v); Chris@16: } Chris@16: Chris@16: template Chris@16: typename F::result_type apply_visitor(F& v) const Chris@16: { Chris@16: return var.apply_visitor(v); Chris@16: } Chris@16: Chris@16: variant_type const& get() const Chris@16: { Chris@16: return var; Chris@16: } Chris@16: Chris@16: variant_type& get() Chris@16: { Chris@16: return var; Chris@16: } Chris@16: Chris@16: variant_type var; Chris@16: }; Chris@16: }} Chris@16: Chris@16: namespace boost Chris@16: { Chris@101: template Chris@16: inline T const& Chris@101: get(boost::spirit::extended_variant< Chris@101: BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)> const& x) Chris@16: { Chris@16: return boost::get(x.get()); Chris@16: } Chris@16: Chris@101: template Chris@16: inline T& Chris@101: get(boost::spirit::extended_variant< Chris@101: BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)>& x) Chris@16: { Chris@16: return boost::get(x.get()); Chris@16: } Chris@16: Chris@101: template Chris@16: inline T const* Chris@101: get(boost::spirit::extended_variant< Chris@101: BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)> const* x) Chris@16: { Chris@16: return boost::get(&x->get()); Chris@16: } Chris@16: Chris@101: template Chris@16: inline T* Chris@101: get(boost::spirit::extended_variant< Chris@101: BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS(T)>* x) Chris@16: { Chris@16: return boost::get(&x->get()); Chris@16: } Chris@16: } Chris@16: Chris@101: #undef BOOST_SPIRIT_EXTENDED_VARIANT_ENUM_PARAMS Chris@101: #undef BOOST_SPIRIT_EXTENDED_VARIANT_LIMIT_TYPES Chris@101: Chris@16: #endif