Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2007 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #ifndef PHOENIX_OPERATOR_SELF_HPP Chris@16: #define PHOENIX_OPERATOR_SELF_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@16: struct reference_eval; Chris@16: struct dereference_eval; Chris@16: struct assign_eval; Chris@16: struct index_eval; Chris@16: Chris@16: BOOST_UNARY_RESULT_OF(&x, result_of_reference) Chris@16: BOOST_UNARY_RESULT_OF(*x, result_of_dereference) Chris@16: BOOST_BINARY_RESULT_OF(x = y, result_of_assign) Chris@16: BOOST_ASYMMETRIC_BINARY_RESULT_OF(x[y], result_of_index) Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct make_assign_composite Chris@16: { Chris@16: typedef actor::type> type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct make_index_composite Chris@16: { Chris@16: typedef actor::type> type; Chris@16: }; Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: typename detail::make_assign_composite, T1>::type Chris@16: actor::operator=(T1 const& a1) const Chris@16: { Chris@16: return compose(*this, a1); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: typename detail::make_index_composite, T1>::type Chris@16: actor::operator[](T1 const& a1) const Chris@16: { Chris@16: return compose(*this, a1); Chris@16: } Chris@16: Chris@16: #define x a0.eval(env) Chris@16: #define y a1.eval(env) Chris@16: Chris@16: PHOENIX_UNARY_EVAL(reference_eval, result_of_reference, &x) Chris@16: PHOENIX_UNARY_EVAL(dereference_eval, result_of_dereference, *x) Chris@16: PHOENIX_UNARY_COMPOSE(reference_eval, &) Chris@16: PHOENIX_UNARY_COMPOSE(dereference_eval, *) Chris@16: Chris@16: PHOENIX_BINARY_EVAL(assign_eval, result_of_assign, x = y) Chris@16: PHOENIX_BINARY_EVAL(index_eval, result_of_index, x[y]) Chris@16: }} Chris@16: Chris@16: #undef x Chris@16: #undef y Chris@16: #endif