/*=============================================================================
    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
