// Copyright (c) 2001-2010 Hartmut Kaiser // // 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) #if !defined(BOOST_SPIRIT_ADAPT_CLASS_ATTRIBUTES_JAN_27_2010_1219PM) #define BOOST_SPIRIT_ADAPT_CLASS_ATTRIBUTES_JAN_27_2010_1219PM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include /////////////////////////////////////////////////////////////////////////////// // forward declaration only namespace boost { namespace fusion { namespace extension { template struct class_member_proxy; }}} /////////////////////////////////////////////////////////////////////////////// // customization points allowing to use adapted classes with spirit namespace boost { namespace spirit { namespace traits { /////////////////////////////////////////////////////////////////////////// template struct is_container > : is_container::type> {}; template struct container_value > : container_value::type> {}; template struct push_back_container, Val , typename enable_if< is_reference::type> >::type> { static bool call(fusion::extension::class_member_proxy& p, Val const& val) { typedef typename fusion::extension::class_member_proxy::type type; return push_back((type)p, val); } }; template struct container_iterator > : container_iterator::type> {}; /////////////////////////////////////////////////////////////////////////// template struct assign_to_attribute_from_value< fusion::extension::class_member_proxy, Val> { static void call(Val const& val, fusion::extension::class_member_proxy& attr) { attr = val; } }; /////////////////////////////////////////////////////////////////////////// template struct attribute_type > : fusion::extension::class_member_proxy {}; /////////////////////////////////////////////////////////////////////////// template struct transform_attribute< fusion::extension::class_member_proxy, Attribute, Domain , typename disable_if< is_reference::lvalue> >::type> { typedef Attribute type; static Attribute pre(fusion::extension::class_member_proxy& val) { return val; } static void post(fusion::extension::class_member_proxy& val , Attribute const& attr) { val = attr; } static void fail(fusion::extension::class_member_proxy&) { } }; template struct transform_attribute< fusion::extension::class_member_proxy, Attribute, Domain , typename enable_if< is_reference::lvalue> >::type> { typedef Attribute& type; static Attribute& pre(fusion::extension::class_member_proxy& val) { return val; } static void post(fusion::extension::class_member_proxy&, Attribute const&) { } static void fail(fusion::extension::class_member_proxy&) { } }; }}} #endif