Chris@16: /*============================================================================== Chris@16: Copyright (c) 2001-2010 Joel de Guzman Chris@16: Copyright (c) 2010 Thomas Heller 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 BOOST_PHOENIX_CORE_REFERENCE_HPP Chris@16: #define BOOST_PHOENIX_CORE_REFERENCE_HPP Chris@16: 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: ///////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // reference Chris@16: // Chris@16: // function for evaluating references, e.g. ref(123) Chris@16: // Chris@16: ///////////////////////////////////////////////////////////////////////////// Chris@16: namespace expression Chris@16: { Chris@16: template Chris@16: struct reference Chris@16: : expression::terminal > Chris@16: { Chris@16: typedef Chris@16: typename expression::terminal >::type Chris@16: type; Chris@16: Chris@16: static const type make(T & t) Chris@16: { Chris@16: typename reference::type const e = {{boost::ref(t)}}; Chris@16: return e; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct reference Chris@16: : expression::terminal > Chris@16: { Chris@16: typedef Chris@16: typename expression::terminal >::type Chris@16: type; Chris@16: Chris@16: static const type make(T const & t) Chris@16: { Chris@16: typename reference::type const e = {{boost::cref(t)}}; Chris@16: return e; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: namespace rule Chris@16: { Chris@16: struct reference Chris@16: : expression::reference Chris@16: {}; Chris@16: } Chris@16: Chris@16: template Chris@101: inline Chris@16: typename expression::reference::type const Chris@101: ref(T & t) Chris@16: { Chris@16: return expression::reference::make(t); Chris@16: } Chris@16: Chris@16: template Chris@101: inline Chris@16: typename expression::reference::type const Chris@101: cref(T const & t) Chris@16: { Chris@16: return expression::reference::make(t); Chris@16: } Chris@16: Chris@16: // Call out boost::reference_wrapper for special handling Chris@16: template Chris@16: struct is_custom_terminal > Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: // Special handling for boost::reference_wrapper Chris@16: template Chris@16: struct custom_terminal > Chris@16: { Chris@16: typedef T &result_type; Chris@16: Chris@16: template Chris@16: T &operator()(boost::reference_wrapper r, Context &) const Chris@16: { Chris@16: return r; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct custom_terminal > > Chris@16: { Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result > const &, Context)> Chris@16: : boost::result_of &, Context)> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct result > &, Context)> Chris@16: : boost::result_of &, Context)> Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename boost::result_of &, Context const &)>::type Chris@16: operator()(boost::reference_wrapper > & r, Context const & ctx) const Chris@16: { Chris@16: return boost::phoenix::eval(r, ctx); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct custom_terminal const> > Chris@16: { Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result const> const &, Context)> Chris@16: : boost::result_of const&, Context)> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct result const> &, Context)> Chris@16: : boost::result_of const&, Context)> Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename boost::result_of const&, Context const &)>::type Chris@16: operator()(boost::reference_wrapper const> const & r, Context & ctx) const Chris@16: { Chris@16: return boost::phoenix::eval(unwrap_ref(r), ctx); Chris@16: } Chris@16: }; Chris@16: }} Chris@16: Chris@16: #endif