Chris@16: // Copyright (c) 2001-2011 Hartmut Kaiser 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: #if !defined(BOOST_SPIRIT_KARMA_PHOENIX_ATTRIBUTES_OCT_01_2009_1128AM) Chris@16: #define BOOST_SPIRIT_KARMA_PHOENIX_ATTRIBUTES_OCT_01_2009_1128AM Chris@16: Chris@16: #if defined(_MSC_VER) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: // we support Phoenix attributes only starting with V2.2 Chris@16: #if SPIRIT_VERSION >= 0x2020 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { namespace spirit { namespace traits Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Provide customization points allowing the use of phoenix expressions as Chris@16: // generator functions in the context of generators expecting a container Chris@16: // attribute (Kleene, plus, list, repeat, etc.) Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct is_container const> Chris@16: : is_container()>::type> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct container_iterator const> Chris@16: { Chris@16: typedef phoenix::actor const& type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct begin_container const> Chris@16: { Chris@16: typedef phoenix::actor const& type; Chris@16: static type call(phoenix::actor const& f) Chris@16: { Chris@16: return f; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct end_container const> Chris@16: { Chris@16: typedef phoenix::actor const& type; Chris@16: static type call(phoenix::actor const& f) Chris@16: { Chris@16: return f; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct deref_iterator const> Chris@16: { Chris@16: typedef typename boost::result_of()>::type type; Chris@16: static type call(phoenix::actor const& f) Chris@16: { Chris@16: return f(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct next_iterator const> Chris@16: { Chris@16: typedef phoenix::actor const& type; Chris@16: static type call(phoenix::actor const& f) Chris@16: { Chris@16: return f; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct compare_iterators const> Chris@16: { Chris@16: static bool Chris@16: call(phoenix::actor const&, phoenix::actor const&) Chris@16: { Chris@16: return false; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct container_value > Chris@16: { Chris@16: typedef phoenix::actor const& type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct make_indirect_iterator const> Chris@16: { Chris@16: typedef phoenix::actor const& type; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Handle Phoenix actors as attributes, just invoke the function object Chris@16: // and deal with the result as the attribute. Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct extract_from_attribute, Exposed> Chris@16: { Chris@16: typedef typename boost::result_of()>::type type; Chris@16: Chris@16: template Chris@16: static type call(phoenix::actor const& f, Context& context) Chris@16: { Chris@16: return f(unused, context); Chris@16: } Chris@16: }; Chris@16: }}} Chris@16: Chris@16: #endif Chris@16: #endif