comparison DEPENDENCIES/generic/include/boost/variant/detail/enable_recursive.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 //-----------------------------------------------------------------------------
2 // boost variant/detail/enable_recursive.hpp header file
3 // See http://www.boost.org for updates, documentation, and revision history.
4 //-----------------------------------------------------------------------------
5 //
6 // Copyright (c) 2003
7 // Eric Friedman
8 //
9 // Distributed under the Boost Software License, Version 1.0. (See
10 // accompanying file LICENSE_1_0.txt or copy at
11 // http://www.boost.org/LICENSE_1_0.txt)
12
13 #ifndef BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP
14 #define BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP
15
16 #include "boost/variant/detail/enable_recursive_fwd.hpp"
17 #include "boost/variant/variant_fwd.hpp"
18
19 #if !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT)
20 # include "boost/mpl/apply.hpp"
21 # include "boost/mpl/eval_if.hpp"
22 # include "boost/mpl/lambda.hpp"
23 #endif
24
25 #include "boost/variant/detail/substitute.hpp"
26 #include "boost/mpl/aux_/config/ctps.hpp"
27 #include "boost/mpl/bool_fwd.hpp"
28 #include "boost/mpl/if.hpp"
29 #include "boost/mpl/or.hpp"
30 #include "boost/type_traits/is_pointer.hpp"
31 #include "boost/type_traits/is_reference.hpp"
32 #include "boost/type_traits/is_same.hpp"
33
34 #include "boost/variant/recursive_wrapper.hpp"
35
36 namespace boost {
37 namespace detail { namespace variant {
38
39 #if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
40
41 # define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(T,Dest,Source) \
42 substitute< T , Dest , Source > \
43 /**/
44
45 #else // defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
46
47 ///////////////////////////////////////////////////////////////////////////////
48 // (detail) class template rebind1
49 //
50 // Limited workaround in case 'substitute' metafunction unavailable.
51 //
52
53 template <typename T, typename U1>
54 struct rebind1
55 {
56 private:
57 typedef typename mpl::lambda<
58 mpl::identity<T>
59 >::type le_;
60
61 public:
62 typedef typename mpl::eval_if<
63 is_same< le_, mpl::identity<T> >
64 , le_ // identity<T>
65 , mpl::apply1<le_, U1>
66 >::type type;
67 };
68
69 # define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(T,Dest,Source) \
70 rebind1< T , Dest > \
71 /**/
72
73 #endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
74
75 ///////////////////////////////////////////////////////////////////////////////
76 // (detail) metafunction enable_recursive
77 //
78 // See boost/variant/detail/enable_recursive_fwd.hpp for more information.
79 //
80
81 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
82
83 template <typename T, typename RecursiveVariant, typename NoWrapper>
84 struct enable_recursive
85 : BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(
86 T, RecursiveVariant, ::boost::recursive_variant_
87 )
88 {
89 };
90
91 template <typename T, typename RecursiveVariant>
92 struct enable_recursive< T,RecursiveVariant,mpl::false_ >
93 {
94 private: // helpers, for metafunction result (below)
95
96 typedef typename BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(
97 T, RecursiveVariant, ::boost::recursive_variant_
98 )::type t_;
99
100 public: // metafunction result
101
102 // [Wrap with recursive_wrapper only if rebind really changed something:]
103 typedef typename mpl::if_<
104 mpl::or_<
105 is_same< t_,T >
106 , is_reference<t_>
107 , is_pointer<t_>
108 >
109 , t_
110 , boost::recursive_wrapper<t_>
111 >::type type;
112
113 };
114
115 #else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
116
117 template <typename T, typename RecursiveVariant, typename NoWrapper>
118 struct enable_recursive
119 {
120 private: // helpers, for metafunction result (below)
121
122 typedef typename BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(
123 T, RecursiveVariant, ::boost::recursive_variant_
124 )::type t_;
125
126 public: // metafunction result
127
128 // [Wrap with recursive_wrapper only if rebind really changed something:]
129 typedef typename mpl::if_<
130 mpl::or_<
131 NoWrapper
132 , is_same< t_,T >
133 , is_reference<t_>
134 , is_pointer<t_>
135 >
136 , t_
137 , boost::recursive_wrapper<t_>
138 >::type type;
139
140 };
141
142 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround
143
144 ///////////////////////////////////////////////////////////////////////////////
145 // (detail) metafunction class quoted_enable_recursive
146 //
147 // Same behavior as enable_recursive metafunction (see above).
148 //
149 template <typename RecursiveVariant, typename NoWrapper>
150 struct quoted_enable_recursive
151 {
152 template <typename T>
153 struct apply
154 : enable_recursive<T, RecursiveVariant, NoWrapper>
155 {
156 };
157 };
158
159 }} // namespace detail::variant
160 } // namespace boost
161
162 #endif // BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP