LRDE Tiger Compiler  1.34a $Id: 7fef12e1f5fa43449d667a0eec1d837c40fc1202 $
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
generic-variant.hxx
Go to the documentation of this file.
1 
6 #ifndef MISC_GENERIC_VARIANT_HXX
7 # define MISC_GENERIC_VARIANT_HXX
8 
9 # include <boost/variant/get.hpp>
10 # include <boost/preprocessor/repetition/repeat_from_to.hpp>
11 # include <boost/preprocessor/punctuation/comma.hpp>
12 # include <misc/generic-variant.hh>
13 
14 // Shortcuts.
15 // Save some bytes (this type and its parameters are so long to type!)
16 # define MISC_GENERIC_VARIANT_PARAMS \
17  typename T0_ BOOST_PP_COMMA() BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)
18 # define MISC_GENERIC_VARIANT_TYPE \
19  generic_variant<T0_ BOOST_PP_COMMA() BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)>
20 
23 # define MISC_GENERIC_VARIANT_CONVERSION_OPERATOR_DEF(z, N, T) \
24  template <MISC_GENERIC_VARIANT_PARAMS> \
25  MISC_GENERIC_VARIANT_TYPE::operator BOOST_PP_CAT(T,N) & () \
26  { \
27  return boost::get<BOOST_PP_CAT(T,N)>(*this); \
28  }
29 
30 # define MISC_GENERIC_VARIANT_CONST_CONVERSION_OPERATOR_DEF(z, N, T) \
31  template <MISC_GENERIC_VARIANT_PARAMS> \
32  MISC_GENERIC_VARIANT_TYPE::operator const BOOST_PP_CAT(T,N) & () const \
33  { \
34  return boost::get<BOOST_PP_CAT(T,N)>(*this); \
35  }
36 
37 
38 
39 namespace misc
40 {
41 
42  template <MISC_GENERIC_VARIANT_PARAMS>
43  MISC_GENERIC_VARIANT_TYPE::generic_variant() : super_type()
44  {
45  // NOTE TO USER :
46  // Compile error from here indicates that the first bound
47  // type is not default-constructible, and so variant cannot
48  // support its own default-construction.
49  }
50 
51  template <MISC_GENERIC_VARIANT_PARAMS>
52  template <typename U>
53  MISC_GENERIC_VARIANT_TYPE::generic_variant(const U& rhs) : super_type(rhs)
54  {
55  }
56 
57  template <MISC_GENERIC_VARIANT_PARAMS>
58  template <typename U>
60  MISC_GENERIC_VARIANT_TYPE::operator=(const U& rhs)
61  {
62  // Don't assign to oneself.
63  if (static_cast<const void*>(&rhs) == static_cast<const void*>(this))
64  return *this;
65  super_type::operator=(rhs);
66  return *this;
67  }
68 
69 
70  template <MISC_GENERIC_VARIANT_PARAMS>
71  MISC_GENERIC_VARIANT_TYPE::operator T0_& ()
72  {
73  return boost::get<T0_>(*this);
74  }
75 
77  1
78  , BOOST_VARIANT_LIMIT_TYPES
80  , T
81  )
82 
84  MISC_GENERIC_VARIANT_TYPE::operator const T0_& () const
85  {
86  return boost::get<T0_>(*this);
87  }
88 
90  1
91  , BOOST_VARIANT_LIMIT_TYPES
93  , T
94  )
95 
96 } // namespace misc
97 
98 # undef MISC_GENERIC_VARIANT_CONVERSION_OPERATOR_DEF
99 # undef MISC_GENERIC_VARIANT_CONST_CONVERSION_OPERATOR_DEF
100 # undef MISC_GENERIC_VARIANT_TYPE
101 # undef MISC_GENERIC_VARIANT_PARAMS
102 
103 #endif // !MISC_GENERIC_VARIANT_HXX