diff options
Diffstat (limited to 'boost/spirit/home/x3/support/utility/lambda_visitor.hpp')
-rw-r--r-- | boost/spirit/home/x3/support/utility/lambda_visitor.hpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/boost/spirit/home/x3/support/utility/lambda_visitor.hpp b/boost/spirit/home/x3/support/utility/lambda_visitor.hpp new file mode 100644 index 0000000000..83e1d2f046 --- /dev/null +++ b/boost/spirit/home/x3/support/utility/lambda_visitor.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2014 Joel de Guzman + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +==============================================================================*/ +#if !defined(BOOST_SPIRIT_X3_LAMBDA_VISITOR_MAY_19_2014_1116AM) +#define BOOST_SPIRIT_X3_LAMBDA_VISITOR_MAY_19_2014_1116AM + +namespace boost { namespace spirit { namespace x3 +{ + template <typename RT, typename... Lambdas> + struct lambda_visitor; + + template <typename RT, typename F, typename... Lambdas> + struct lambda_visitor<RT, F, Lambdas...> : F, lambda_visitor<RT, Lambdas...> + { + typedef lambda_visitor<RT , Lambdas...> base_type; + using F::operator(); + using base_type::operator(); + lambda_visitor(F f, Lambdas... lambdas) + : F(f), base_type(lambdas...) + {} + }; + + template <typename RT, typename F> + struct lambda_visitor<RT, F> : F + { + typedef RT result_type; + using F::operator(); + lambda_visitor(F f) + : F(f) + {} + }; + + template <typename RT> + struct lambda_visitor<RT> + { + typedef RT result_type; + }; + + template <typename RT, typename... Lambdas> + lambda_visitor<RT, Lambdas...> make_lambda_visitor(Lambdas... lambdas) + { + return { lambdas... }; + } +}}} + +#endif |