Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r59340 - in trunk/boost/fusion: . adapted adapted/class include
From: hartmut.kaiser_at_[hidden]
Date: 2010-01-29 10:03:36


Author: hkaiser
Date: 2010-01-29 10:03:35 EST (Fri, 29 Jan 2010)
New Revision: 59340
URL: http://svn.boost.org/trac/boost/changeset/59340

Log:
Fusion: fixed adapt_class to be usable with Spirit, added adapt_class_named
Added:
   trunk/boost/fusion/adapted/class/adapt_class_named.hpp (contents, props changed)
   trunk/boost/fusion/include/adapted_class_named.cpp (contents, props changed)
Text files modified:
   trunk/boost/fusion/adapted.hpp | 1
   trunk/boost/fusion/adapted/class.hpp | 5 +-
   trunk/boost/fusion/adapted/class/adapt_class.hpp | 69 ++++++++++++++++++++++-----------------
   3 files changed, 43 insertions(+), 32 deletions(-)

Modified: trunk/boost/fusion/adapted.hpp
==============================================================================
--- trunk/boost/fusion/adapted.hpp (original)
+++ trunk/boost/fusion/adapted.hpp 2010-01-29 10:03:35 EST (Fri, 29 Jan 2010)
@@ -13,5 +13,6 @@
 #include <boost/fusion/adapted/array.hpp>
 #include <boost/fusion/adapted/mpl.hpp>
 #include <boost/fusion/adapted/struct.hpp>
+#include <boost/fusion/adapted/class.hpp>
 
 #endif

Modified: trunk/boost/fusion/adapted/class.hpp
==============================================================================
--- trunk/boost/fusion/adapted/class.hpp (original)
+++ trunk/boost/fusion/adapted/class.hpp 2010-01-29 10:03:35 EST (Fri, 29 Jan 2010)
@@ -9,8 +9,9 @@
 #define BOOST_FUSION_CLASS_OCTOBER_4_2009_839PM
 
 #include <boost/fusion/adapted/class/extension.hpp>
-#include <boost/fusion/adapted/class/adapt_struct.hpp>
-#include <boost/fusion/adapted/class/adapt_assoc_struct.hpp>
+#include <boost/fusion/adapted/class/adapt_class.hpp>
+#include <boost/fusion/adapted/class/adapt_class_named.hpp>
+#include <boost/fusion/adapted/class/adapt_assoc_class.hpp>
 #include <boost/fusion/adapted/class/class_iterator.hpp>
 
 #include <boost/fusion/adapted/class/detail/at_impl.hpp>

Modified: trunk/boost/fusion/adapted/class/adapt_class.hpp
==============================================================================
--- trunk/boost/fusion/adapted/class/adapt_class.hpp (original)
+++ trunk/boost/fusion/adapted/class/adapt_class.hpp 2010-01-29 10:03:35 EST (Fri, 29 Jan 2010)
@@ -1,5 +1,6 @@
 /*=============================================================================
     Copyright (c) 2001-2009 Joel de Guzman
+ Copyright (c) 2009-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)
@@ -28,6 +29,10 @@
 #include <boost/preprocessor/cat.hpp>
 #include <boost/mpl/int.hpp>
 #include <boost/config/no_tr1/utility.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
 
 #define BOOST_FUSION_ADAPT_CLASS(name, bseq) \
     BOOST_FUSION_ADAPT_CLASS_I( \
@@ -75,49 +80,53 @@
     { \
         template <> \
         struct class_size<name> : mpl::int_<BOOST_PP_SEQ_SIZE(seq)> {}; \
+ template <typename T, int N> struct class_member_proxy; \
         BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_CLASS_C, name, seq) \
     }}} \
     /***/
 
-#define BOOST_FUSION_ADAPT_CLASS_C(r, name, i, xy) \
+#define BOOST_FUSION_ADAPT_CLASS_C(r, fullname, i, xy) \
     template <> \
- struct class_member<name, i> \
+ struct class_member_proxy<fullname, i> \
     { \
- typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) type; \
- typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) get_type; \
- struct proxy \
- { \
- typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) type; \
- typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) get_type; \
- typedef \
- add_reference<add_const<type>::type>::type \
- cref_type; \
- \
- proxy(name& obj) : obj(obj) {} \
- name& obj; \
- \
- proxy& operator=(cref_type val) \
- { \
- BOOST_PP_TUPLE_ELEM(4, 3, xy); \
- return *this; \
- } \
- \
- operator get_type() \
- { \
- return BOOST_PP_TUPLE_ELEM(4, 2, xy); \
- } \
- }; \
+ typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) lvalue; \
+ typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) rvalue; \
+ typedef remove_const<remove_reference<lvalue>::type>::type type; \
+ typedef add_reference<add_const<type>::type>::type cref_type; \
+ \
+ class_member_proxy(fullname& obj) : obj(obj) {} \
+ fullname& obj; \
+ \
+ class_member_proxy& operator=(cref_type val) \
+ { \
+ BOOST_PP_TUPLE_ELEM(4, 3, xy); \
+ return *this; \
+ } \
                                                                                 \
- static get_type call(name const& obj) \
+ operator lvalue() \
         { \
             return BOOST_PP_TUPLE_ELEM(4, 2, xy); \
- }; \
+ } \
+ }; \
+ \
+ template <> \
+ struct class_member<fullname, i> \
+ { \
+ typedef class_member_proxy<fullname, i> proxy; \
+ typedef proxy::type type; \
+ typedef proxy::rvalue get_type; \
                                                                                 \
- static proxy call(name& obj) \
+ static get_type call(fullname const& obj) \
+ { \
+ return BOOST_PP_TUPLE_ELEM(4, 2, xy); \
+ } \
+ \
+ static proxy call(fullname& obj) \
         { \
             return proxy(obj); \
- }; \
+ } \
     }; \
     /***/
 
+
 #endif

Added: trunk/boost/fusion/adapted/class/adapt_class_named.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/adapted/class/adapt_class_named.hpp 2010-01-29 10:03:35 EST (Fri, 29 Jan 2010)
@@ -0,0 +1,156 @@
+/*=============================================================================
+ Copyright (c) 2001-2009 Joel de Guzman
+ Copyright (c) 2009-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_FUSION_ADAPT_CLASS_NAMED_JAN_27_2010_0614PM)
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_JAN_27_2010_0614PM
+
+#include <boost/fusion/support/tag_of_fwd.hpp>
+#include <boost/fusion/adapted/class/extension.hpp>
+#include <boost/fusion/adapted/class/class_iterator.hpp>
+#include <boost/fusion/adapted/class/detail/is_view_impl.hpp>
+#include <boost/fusion/adapted/class/detail/is_sequence_impl.hpp>
+#include <boost/fusion/adapted/class/detail/category_of_impl.hpp>
+#include <boost/fusion/adapted/class/detail/begin_impl.hpp>
+#include <boost/fusion/adapted/class/detail/end_impl.hpp>
+#include <boost/fusion/adapted/class/detail/size_impl.hpp>
+#include <boost/fusion/adapted/class/detail/at_impl.hpp>
+#include <boost/fusion/adapted/class/detail/value_at_impl.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+#include <boost/preprocessor/seq/for_each_i.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/config/no_tr1/utility.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
+
+#define BOOST_FUSION_ADAPT_CLASS_NAMED(name, newname, bseq) \
+ BOOST_FUSION_ADAPT_CLASS_NAMED_I(name, (boost)(fusion)(adapted), newname, \
+ BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_NAMED_X bseq, 0)) \
+ /***/
+
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS(name, ns, newname, bseq) \
+ BOOST_FUSION_ADAPT_CLASS_NAMED_I(name, ns, newname, \
+ BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_NAMED_X bseq, 0)) \
+ /***/
+
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_X(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_NAMED_Y
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_Y(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_NAMED_X
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_X0
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_Y0
+
+// BOOST_FUSION_ADAPT_CLASS_I generates the overarching structure and uses
+// SEQ_FOR_EACH_I to generate the "linear" substructures.
+// Thanks to Paul Mensonides for the PP macro help
+
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_I(name, ns, newname, seq) \
+ BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_CLASS_NAMED_NS_B, _, ns) \
+ struct newname \
+ { \
+ newname(name& s) : obj(s) {} \
+ name& obj; \
+ }; \
+ BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_CLASS_NAMED_NS_E, _, ns) \
+ \
+ namespace boost { namespace fusion { namespace traits \
+ { \
+ template <> \
+ struct tag_of<BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname)> \
+ { \
+ typedef class_tag type; \
+ }; \
+ }}} \
+ \
+ namespace boost { namespace mpl \
+ { \
+ template<typename> \
+ struct sequence_tag; \
+ \
+ template<> \
+ struct sequence_tag<BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname)> \
+ { \
+ typedef fusion::fusion_sequence_tag type; \
+ }; \
+ \
+ template<> \
+ struct sequence_tag<BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname) const> \
+ { \
+ typedef fusion::fusion_sequence_tag type; \
+ }; \
+ }} \
+ \
+ namespace boost { namespace fusion { namespace extension \
+ { \
+ template <> \
+ struct class_size<BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname)> \
+ : mpl::int_<BOOST_PP_SEQ_SIZE(seq)> {}; \
+ template <typename T, int N> struct class_member_proxy; \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_CLASS_NAMED_C, \
+ BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname),seq) \
+ }}} \
+ /***/
+
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname) \
+ BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_CLASS_NAMED_NS_D, _, ns) \
+ newname \
+ /***/
+
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS_B(r, _, ns) namespace ns {
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS_D(r, _, ns) ns::
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS_E(r, _, ns) }
+
+#define BOOST_FUSION_ADAPT_CLASS_NAMED_C(r, fullname, i, xy) \
+ template <> \
+ struct class_member_proxy<fullname, i> \
+ { \
+ typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) lvalue; \
+ typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) rvalue; \
+ typedef remove_const<remove_reference<lvalue>::type>::type type; \
+ typedef add_reference<add_const<type>::type>::type cref_type; \
+ \
+ class_member_proxy(fullname& obj) : obj(obj) {} \
+ fullname& obj; \
+ \
+ class_member_proxy& operator=(cref_type val) \
+ { \
+ obj.BOOST_PP_TUPLE_ELEM(4, 3, xy); \
+ return *this; \
+ } \
+ \
+ operator lvalue() \
+ { \
+ return obj.BOOST_PP_TUPLE_ELEM(4, 2, xy); \
+ } \
+ }; \
+ \
+ template <> \
+ struct class_member<fullname, i> \
+ { \
+ typedef class_member_proxy<fullname, i> proxy; \
+ typedef proxy::type type; \
+ typedef proxy::rvalue get_type; \
+ \
+ static get_type call(fullname const& obj) \
+ { \
+ return obj.BOOST_PP_TUPLE_ELEM(4, 2, xy); \
+ } \
+ \
+ static proxy call(fullname& obj) \
+ { \
+ return proxy(obj); \
+ } \
+ }; \
+ /***/
+
+#endif

Added: trunk/boost/fusion/include/adapted_class_named.cpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/include/adapted_class_named.cpp 2010-01-29 10:03:35 EST (Fri, 29 Jan 2010)
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2009 Joel de Guzman
+
+ 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(FUSION_INCLUDE_ADAPT_CLASS_NAMED)
+#define FUSION_INCLUDE_ADAPT_CLASS_NAMED
+
+#include <boost/fusion/adapted/class/adapt_class_named.hpp>
+
+#endif


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk