| /*============================================================================= |
| Copyright (c) 2005-2010 Joel de Guzman |
| Copyright (c) 2010 Eric Niebler |
| |
| 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_DOMAIN_HPP |
| #define BOOST_PHOENIX_CORE_DOMAIN_HPP |
| |
| #include <boost/phoenix/core/limits.hpp> |
| #include <boost/proto/matches.hpp> |
| #include <boost/proto/transform/call.hpp> |
| #include <boost/proto/transform/when.hpp> |
| #include <boost/proto/domain.hpp> |
| |
| namespace boost { namespace phoenix |
| { |
| template <typename Expr> |
| struct actor; |
| |
| struct meta_grammar; |
| |
| struct phoenix_generator |
| : proto::switch_<phoenix_generator> |
| { |
| |
| BOOST_PROTO_USE_BASIC_EXPR() |
| |
| template<typename Tag> |
| struct case_ |
| : proto::otherwise<proto::call<proto::pod_generator<actor>(proto::_)> > |
| {}; |
| }; |
| |
| // proto's assignment operator takes rhs by reference |
| template<> |
| struct phoenix_generator::case_<proto::tag::assign> |
| : proto::otherwise<proto::call<proto::compose_generators< |
| proto::by_value_generator |
| , proto::pod_generator<actor> |
| >(proto::_)> > |
| {}; |
| |
| // proto's subscript operator takes rhs by reference |
| template<> |
| struct phoenix_generator::case_<proto::tag::subscript> |
| : proto::otherwise<proto::call<proto::compose_generators< |
| proto::by_value_generator |
| , proto::pod_generator<actor> |
| >(proto::_)> > |
| {}; |
| |
| struct phoenix_default_domain |
| : proto::domain< |
| proto::basic_default_generator |
| , proto::_ |
| , proto::basic_default_domain |
| > |
| { |
| template <typename T> |
| struct as_child |
| //: proto_base_domain::as_expr<T> // proto lambda example. |
| : as_expr<T> |
| {}; |
| }; |
| |
| struct phoenix_domain |
| : proto::domain< |
| phoenix_generator |
| , meta_grammar |
| , proto::basic_default_domain |
| > |
| { |
| template <typename T> |
| struct as_child |
| //: proto_base_domain::as_expr<T> // proto lambda example. |
| : as_expr<T> |
| {}; |
| }; |
| }} |
| |
| #endif |