LRDE Tiger Compiler  1.34a $Id: 7fef12e1f5fa43449d667a0eec1d837c40fc1202 $
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
generic-variant.hh
Go to the documentation of this file.
1 
24 #ifndef MISC_GENERIC_VARIANT_HH
25 # define MISC_GENERIC_VARIANT_HH
26 
27 # include <boost/variant.hpp>
28 # include <boost/preprocessor/repetition/repeat_from_to.hpp>
29 
34 # define MISC_GENERIC_VARIANT_AUX_DECLARE_PARAMS_IMPL(z, N, T) \
35  typename BOOST_PP_CAT(T, N) = BOOST_PP_CAT(boost::detail::variant::void, N)
36 
37 # define MISC_GENERIC_VARIANT_AUX_DECLARE_PARAMS \
38  BOOST_PP_ENUM( \
39  BOOST_VARIANT_LIMIT_TYPES \
40  , MISC_GENERIC_VARIANT_AUX_DECLARE_PARAMS_IMPL \
41  , T \
42  )
43 
44 
45 // Distinct void ``tags'' trick, copied from boost/variant/variant_fwd.hpp.
46 # define BOOST_VARIANT_DETAIL_DEFINE_VOID_N(z, N, _) \
47  struct BOOST_PP_CAT(void, N); \
48  \
49  template<> \
50  struct convert_void< BOOST_PP_CAT(void, N) > \
51  { \
52  typedef mpl::na type; \
53  };
54 
55 namespace boost
56 {
57  namespace detail
58  {
59  namespace variant
60  {
61  BOOST_PP_REPEAT(
62  BOOST_VARIANT_LIMIT_TYPES
64  , _
65  )
66  }
67  }
68 }
69 
70 # undef BOOST_VARIANT_DETAIL_DEFINE_VOID_N
71 
72 namespace misc
73 {
74 
81  template < MISC_GENERIC_VARIANT_AUX_DECLARE_PARAMS >
82  class generic_variant;
83 
84 } // namespace misc
85 
86 # undef MISC_GENERIC_VARIANT_AUX_DECLARE_PARAMS_IMPL
87 # undef MISC_GENERIC_VARIANT_AUX_DECLARE_PARAMS
88 
91 # define MISC_GENERIC_VARIANT_CONVERSION_OPERATOR_DECL(z, N, T) \
92  operator BOOST_PP_CAT(T,N) & ();
93 # define MISC_GENERIC_VARIANT_CONST_CONVERSION_OPERATOR_DECL(z, N, T) \
94  operator const BOOST_PP_CAT(T,N) & () const;
95 
96 
97 
98 namespace misc
99 {
110  template <typename T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)>
112  public boost::variant<T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)>
113  {
114  public:
119  typedef boost::variant<T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)>
121 
124  generic_variant();
125  template <typename U> generic_variant(const U& rhs);
127 
128  template <typename U> self_type& operator=(const U&);
129 
135  operator T0_& ();
137  1
138  , BOOST_VARIANT_LIMIT_TYPES
140  , T
141  )
143 
146  operator const T0_& () const;
148  1
149  , BOOST_VARIANT_LIMIT_TYPES
151  , T
152  )
154  };
155 
156 } // namespace misc
157 
158 # undef MISC_GENERIC_VARIANT_CONST_CONVERSION_OPERATOR_DECL
159 # undef MISC_GENERIC_VARIANT_CONVERSION_OPERATOR_DECL
160 
161 # include <misc/generic-variant.hxx>
162 
163 #endif // !MISC_GENERIC_VARIANT_HH