// 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_ADT_ATTRIBUTES_SEP_15_2010_1219PM) #define BOOST_SPIRIT_ADAPT_ADT_ATTRIBUTES_SEP_15_2010_1219PM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include /////////////////////////////////////////////////////////////////////////////// // customization points allowing to use adapted classes with spirit namespace boost { namespace spirit { namespace traits { /////////////////////////////////////////////////////////////////////////// template struct is_container > : is_container< typename fusion::extension::adt_attribute_proxy::type > {}; template struct container_value > : container_value< typename fusion::extension::access::adt_attribute_proxy< T, N, Const >::type > {}; template struct push_back_container< fusion::extension::adt_attribute_proxy , Val , typename enable_if::type > >::type> { static bool call( fusion::extension::adt_attribute_proxy& p , Val const& val) { typedef typename fusion::extension::adt_attribute_proxy::type type; return push_back(type(p), val); } }; template struct container_iterator > : container_iterator< typename fusion::extension::adt_attribute_proxy::type > {}; /////////////////////////////////////////////////////////////////////////// template struct assign_to_attribute_from_value< fusion::extension::adt_attribute_proxy , Val> { static void call(Val const& val , fusion::extension::adt_attribute_proxy& attr) { attr = val; } }; /////////////////////////////////////////////////////////////////////////// template struct attribute_type > : fusion::extension::adt_attribute_proxy {}; /////////////////////////////////////////////////////////////////////////// template < typename T, int N, bool Const, typename Attribute, typename Domain> struct transform_attribute< fusion::extension::adt_attribute_proxy , Attribute , Domain , typename disable_if::type > >::type> { typedef Attribute type; static Attribute pre(fusion::extension::adt_attribute_proxy& val) { return val; } static void post( fusion::extension::adt_attribute_proxy& val , Attribute const& attr) { val = attr; } static void fail(fusion::extension::access::adt_attribute_proxy&) { } }; template < typename T, int N, bool Const, typename Attribute, typename Domain> struct transform_attribute< fusion::extension::adt_attribute_proxy , Attribute , Domain , typename enable_if::type > >::type> { typedef Attribute& type; static Attribute& pre(fusion::extension::adt_attribute_proxy& val) { return val; } static void post( fusion::extension::adt_attribute_proxy& , Attribute const&) { } static void fail(fusion::extension::adt_attribute_proxy&) { } }; template struct clear_value > { static void call( fusion::extension::adt_attribute_proxy& val) { typedef typename fusion::extension::adt_attribute_proxy::type type; clear(type(val)); } }; }}} #endif