1 // Copyright (c) 2001-2011 Hartmut Kaiser 2 // Copyright (c) 2001-2011 Joel de Guzman 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 7 #ifndef BOOST_SPIRIT_KARMA_DETAIL_ATTRIBUTES_HPP 8 #define BOOST_SPIRIT_KARMA_DETAIL_ATTRIBUTES_HPP 9 10 #include <boost/spirit/home/karma/domain.hpp> 11 #include <boost/spirit/home/support/attributes_fwd.hpp> 12 #include <boost/spirit/home/support/attributes.hpp> 13 14 /////////////////////////////////////////////////////////////////////////////// 15 namespace boost { namespace spirit { namespace karma 16 { 17 template <typename Exposed, typename Transformed, typename Enable = void> 18 struct transform_attribute 19 { 20 typedef Transformed type; preboost::spirit::karma::transform_attribute21 static Transformed pre(Exposed& val) 22 { 23 return Transformed(traits::extract_from<Transformed>(val, unused)); 24 } 25 // Karma only, no post() and no fail() required 26 }; 27 28 template <typename Exposed, typename Transformed> 29 struct transform_attribute<boost::optional<Exposed> const, Transformed 30 , typename disable_if<is_same<boost::optional<Exposed>, Transformed> >::type> 31 { 32 typedef Transformed const& type; preboost::spirit::karma::disable_if::type33 static Transformed const& pre(boost::optional<Exposed> const& val) 34 { 35 return boost::get<Transformed>(val); 36 } 37 }; 38 39 template <typename Attribute> 40 struct transform_attribute<Attribute const, Attribute> 41 { 42 typedef Attribute const& type; preboost::spirit::karma::transform_attribute43 static Attribute const& pre(Attribute const& val) { return val; } 44 // Karma only, no post() and no fail() required 45 }; 46 47 // unused_type needs some special handling as well 48 template <> 49 struct transform_attribute<unused_type, unused_type> 50 { 51 typedef unused_type type; preboost::spirit::karma::transform_attribute52 static unused_type pre(unused_type) { return unused; } 53 }; 54 55 template <> 56 struct transform_attribute<unused_type const, unused_type> 57 : transform_attribute<unused_type, unused_type> 58 {}; 59 60 template <typename Attribute> 61 struct transform_attribute<Attribute, unused_type> 62 : transform_attribute<unused_type, unused_type> 63 {}; 64 65 template <typename Attribute> 66 struct transform_attribute<Attribute const, unused_type> 67 : transform_attribute<unused_type, unused_type> 68 {}; 69 }}} 70 71 /////////////////////////////////////////////////////////////////////////////// 72 namespace boost { namespace spirit { namespace traits { namespace detail 73 { 74 template <typename Exposed, typename Transformed> 75 struct transform_attribute_base<Exposed, Transformed, karma::domain> 76 : karma::transform_attribute<Exposed, Transformed> 77 {}; 78 }}}} 79 80 #endif 81