84 lines
3.0 KiB
Plaintext
84 lines
3.0 KiB
Plaintext
|
/*=============================================================================
|
||
|
Copyright (c) 2016 Kohei Takahashi
|
||
|
|
||
|
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)
|
||
|
==============================================================================*/
|
||
|
#ifndef BOOST_PHOENIX_CORE_EXPRESSION_HPP
|
||
|
#define BOOST_PHOENIX_CORE_EXPRESSION_HPP
|
||
|
|
||
|
#include <boost/phoenix/core/limits.hpp>
|
||
|
#include <boost/call_traits.hpp>
|
||
|
#include <boost/fusion/sequence/intrinsic/at.hpp>
|
||
|
#include <boost/phoenix/core/as_actor.hpp>
|
||
|
#include <boost/phoenix/core/detail/expression.hpp>
|
||
|
#include <boost/phoenix/core/domain.hpp>
|
||
|
#include <boost/proto/domain.hpp>
|
||
|
#include <boost/proto/make_expr.hpp>
|
||
|
#include <boost/proto/transform/pass_through.hpp>
|
||
|
|
||
|
namespace boost { namespace phoenix
|
||
|
{
|
||
|
template <typename Expr> struct actor;
|
||
|
|
||
|
#ifdef BOOST_PHOENIX_NO_VARIADIC_EXPRESSION
|
||
|
#include <boost/phoenix/core/detail/cpp03/expression.hpp>
|
||
|
#else
|
||
|
template <template <typename> class Actor, typename Tag, typename... A>
|
||
|
struct expr_ext;
|
||
|
|
||
|
// This void filter is necessary to avoid forming reference to void
|
||
|
// because most of other expressions are not based on variadics.
|
||
|
template <typename Tag, typename F, typename... T>
|
||
|
struct expr_impl;
|
||
|
|
||
|
template <typename Tag, typename... A>
|
||
|
struct expr_impl<Tag, void(A...)> : expr_ext<actor, Tag, A...> {};
|
||
|
|
||
|
template <typename Tag, typename... A, typename... T>
|
||
|
struct expr_impl<Tag, void(A...), void, T...> : expr_impl<Tag, void(A...)> {};
|
||
|
|
||
|
template <typename Tag, typename... A, typename H, typename... T>
|
||
|
struct expr_impl<Tag, void(A...), H, T...> : expr_impl<Tag, void(A..., H), T...> {};
|
||
|
|
||
|
template <typename Tag, typename... A>
|
||
|
struct expr : expr_impl<Tag, void(), A...> {};
|
||
|
|
||
|
template <template <typename> class Actor, typename Tag, typename... A>
|
||
|
struct expr_ext
|
||
|
: proto::transform<expr_ext<Actor, Tag, A...>, int>
|
||
|
{
|
||
|
typedef
|
||
|
typename proto::result_of::make_expr<
|
||
|
Tag
|
||
|
, phoenix_default_domain //proto::basic_default_domain
|
||
|
, typename proto::detail::uncvref<typename call_traits<A>::value_type>::type...
|
||
|
>::type
|
||
|
base_type;
|
||
|
|
||
|
typedef Actor<base_type> type;
|
||
|
|
||
|
typedef typename proto::nary_expr<Tag, A...>::proto_grammar proto_grammar;
|
||
|
|
||
|
static type make(typename call_traits<A>::param_type... a)
|
||
|
{ //?? actor or Actor??
|
||
|
//Actor<base_type> const e =
|
||
|
actor<base_type> const e =
|
||
|
{
|
||
|
proto::make_expr<Tag, phoenix_default_domain>(a...)
|
||
|
};
|
||
|
return e;
|
||
|
}
|
||
|
|
||
|
template<typename Expr, typename State, typename Data>
|
||
|
struct impl
|
||
|
: proto::pass_through<expr_ext>::template impl<Expr, State, Data>
|
||
|
{};
|
||
|
|
||
|
typedef Tag proto_tag;
|
||
|
};
|
||
|
#endif
|
||
|
}}
|
||
|
|
||
|
#endif
|