blob: 09660520e66ddadb605fa11c2c7444df7cd93c73 [file] [log] [blame]
Jeff Thompsona28eed82013-08-22 16:21:10 -07001
2#if !defined(BOOST_PP_IS_ITERATING)
3
4///// header body
5
6#ifndef BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
7#define BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
8
9// Copyright Aleksey Gurtovoy 2000-2004
10//
11// Distributed under the Boost Software License, Version 1.0.
12// (See accompanying file LICENSE_1_0.txt or copy at
13// http://www.boost.org/LICENSE_1_0.txt)
14//
15// See http://www.boost.org/libs/mpl for documentation.
16
17// $Id: lambda_no_ctps.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
18// $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $
19// $Revision: 49267 $
20
21#if !defined(BOOST_MPL_PREPROCESSING_MODE)
22# include <ndnboost/mpl/lambda_fwd.hpp>
23# include <ndnboost/mpl/bind_fwd.hpp>
24# include <ndnboost/mpl/protect.hpp>
25# include <ndnboost/mpl/is_placeholder.hpp>
26# include <ndnboost/mpl/if.hpp>
27# include <ndnboost/mpl/identity.hpp>
28# include <ndnboost/mpl/bool.hpp>
29# include <ndnboost/mpl/aux_/na_spec.hpp>
30# include <ndnboost/mpl/aux_/lambda_support.hpp>
31# include <ndnboost/mpl/aux_/template_arity.hpp>
32# include <ndnboost/mpl/aux_/value_wknd.hpp>
33#endif
34
35#include <ndnboost/mpl/aux_/config/use_preprocessed.hpp>
36
37#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
38 && !defined(BOOST_MPL_PREPROCESSING_MODE)
39
40# define BOOST_MPL_PREPROCESSED_HEADER lambda_no_ctps.hpp
41# include <ndnboost/mpl/aux_/include_preprocessed.hpp>
42
43#else
44
45# include <ndnboost/mpl/limits/arity.hpp>
46# include <ndnboost/mpl/aux_/preprocessor/params.hpp>
47# include <ndnboost/mpl/aux_/preprocessor/default_params.hpp>
48# include <ndnboost/mpl/aux_/preprocessor/repeat.hpp>
49# include <ndnboost/mpl/aux_/preprocessor/enum.hpp>
50# include <ndnboost/mpl/aux_/config/msvc.hpp>
51# include <ndnboost/mpl/aux_/config/workaround.hpp>
52
53# include <ndnboost/preprocessor/comma_if.hpp>
54# include <ndnboost/preprocessor/iterate.hpp>
55# include <ndnboost/preprocessor/inc.hpp>
56# include <ndnboost/preprocessor/cat.hpp>
57
58namespace ndnboost { namespace mpl {
59
60# define AUX778076_LAMBDA_PARAMS(i_, param) \
61 BOOST_MPL_PP_PARAMS(i_, param) \
62 /**/
63
64namespace aux {
65
66#define n_ BOOST_MPL_LIMIT_METAFUNCTION_ARITY
67template<
68 BOOST_MPL_PP_DEFAULT_PARAMS(n_,bool C,false)
69 >
70struct lambda_or
71 : true_
72{
73};
74
75template<>
76struct lambda_or< BOOST_MPL_PP_ENUM(n_,false) >
77 : false_
78{
79};
80#undef n_
81
82template< typename Arity > struct lambda_impl
83{
84 template< typename T, typename Tag, typename Protect > struct result_
85 {
86 typedef T type;
87 typedef is_placeholder<T> is_le;
88 };
89};
90
91#define BOOST_PP_ITERATION_PARAMS_1 \
92 (3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <ndnboost/mpl/aux_/lambda_no_ctps.hpp>))
93#include BOOST_PP_ITERATE()
94
95} // namespace aux
96
97template<
98 typename T
99 , typename Tag
100 , typename Protect
101 >
102struct lambda
103{
104 /// Metafunction forwarding confuses MSVC 6.x
105 typedef typename aux::template_arity<T>::type arity_;
106 typedef typename aux::lambda_impl<arity_>
107 ::template result_< T,Tag,Protect > l_;
108
109 typedef typename l_::type type;
110 typedef typename l_::is_le is_le;
111
112 BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
113};
114
115BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
116
117template<
118 typename T
119 >
120struct is_lambda_expression
121 : lambda<T>::is_le
122{
123};
124
125# undef AUX778076_LAMBDA_PARAMS
126
127}}
128
129#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
130#endif // BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
131
132///// iteration, depth == 1
133
134#else
135
136#define i_ BOOST_PP_FRAME_ITERATION(1)
137
138# define AUX778076_LAMBDA_TYPEDEF(unused, i_, F) \
139 typedef lambda< \
140 typename F::BOOST_PP_CAT(arg,BOOST_PP_INC(i_)) \
141 , Tag \
142 , false_ \
143 > BOOST_PP_CAT(l,BOOST_PP_INC(i_)); \
144 /**/
145
146# define AUX778076_IS_LE_TYPEDEF(unused, i_, unused2) \
147 typedef typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::is_le \
148 BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)); \
149 /**/
150
151# define AUX778076_IS_LAMBDA_EXPR(unused, i_, unused2) \
152 BOOST_PP_COMMA_IF(i_) \
153 BOOST_MPL_AUX_MSVC_VALUE_WKND(BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)))::value \
154 /**/
155
156# define AUX778076_LAMBDA_RESULT(unused, i_, unused2) \
157 , typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::type \
158 /**/
159
160template<> struct lambda_impl< int_<i_> >
161{
162 template< typename F, typename Tag, typename Protect > struct result_
163 {
164 BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_TYPEDEF, F)
165 BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LE_TYPEDEF, unused)
166
167 typedef aux::lambda_or<
168 BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LAMBDA_EXPR, unused)
169 > is_le;
170
171 typedef BOOST_PP_CAT(bind,i_)<
172 typename F::rebind
173 BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_RESULT, unused)
174 > bind_;
175
176 typedef typename if_<
177 is_le
178 , if_< Protect, mpl::protect<bind_>, bind_ >
179 , identity<F>
180 >::type type_;
181
182 typedef typename type_::type type;
183 };
184};
185
186# undef AUX778076_LAMBDA_RESULT
187# undef AUX778076_IS_LAMBDA_EXPR
188# undef AUX778076_IS_LE_TYPEDEF
189# undef AUX778076_LAMBDA_TYPEDEF
190
191#undef i_
192
193#endif // BOOST_PP_IS_ITERATING