Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r59337 - in trunk/boost/fusion: adapted adapted/struct include
From: hartmut.kaiser_at_[hidden]
Date: 2010-01-28 20:58:51


Author: hkaiser
Date: 2010-01-28 20:58:50 EST (Thu, 28 Jan 2010)
New Revision: 59337
URL: http://svn.boost.org/trac/boost/changeset/59337

Log:
Fusion: more work on adapt_struct_named
Added:
   trunk/boost/fusion/adapted/struct/adapt_struct_named.hpp
      - copied, changed from r59335, /trunk/boost/fusion/adapted/struct/adapt_named_struct.hpp
   trunk/boost/fusion/include/adapt_struct_named.hpp (contents, props changed)
Removed:
   trunk/boost/fusion/adapted/struct/adapt_named_struct.hpp
Text files modified:
   trunk/boost/fusion/adapted/struct.hpp | 2
   trunk/boost/fusion/adapted/struct/adapt_struct_named.hpp | 77 ++++++++++++++++++++++-----------------
   2 files changed, 44 insertions(+), 35 deletions(-)

Modified: trunk/boost/fusion/adapted/struct.hpp
==============================================================================
--- trunk/boost/fusion/adapted/struct.hpp (original)
+++ trunk/boost/fusion/adapted/struct.hpp 2010-01-28 20:58:50 EST (Thu, 28 Jan 2010)
@@ -10,7 +10,7 @@
 
 #include <boost/fusion/adapted/struct/extension.hpp>
 #include <boost/fusion/adapted/struct/adapt_struct.hpp>
-#include <boost/fusion/adapted/struct/adapt_named_struct.hpp>
+#include <boost/fusion/adapted/struct/adapt_struct_named.hpp>
 #include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
 #include <boost/fusion/adapted/struct/struct_iterator.hpp>
 

Deleted: trunk/boost/fusion/adapted/struct/adapt_named_struct.hpp
==============================================================================
--- trunk/boost/fusion/adapted/struct/adapt_named_struct.hpp 2010-01-28 20:58:50 EST (Thu, 28 Jan 2010)
+++ (empty file)
@@ -1,119 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2007 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_NAMED_ADAPT_STRUCT_SEP_29_2009_0748PM)
-#define BOOST_FUSION_NAMED_ADAPT_STRUCT_SEP_29_2009_0748PM
-
-#include <boost/fusion/support/tag_of_fwd.hpp>
-#include <boost/fusion/adapted/struct/extension.hpp>
-#include <boost/fusion/adapted/struct/struct_iterator.hpp>
-#include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
-#include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
-#include <boost/fusion/adapted/struct/detail/category_of_impl.hpp>
-#include <boost/fusion/adapted/struct/detail/begin_impl.hpp>
-#include <boost/fusion/adapted/struct/detail/end_impl.hpp>
-#include <boost/fusion/adapted/struct/detail/size_impl.hpp>
-#include <boost/fusion/adapted/struct/detail/at_impl.hpp>
-#include <boost/fusion/adapted/struct/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/seq/elem.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>
-
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT(name, newname, bseq) \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_I((())(name)(newname), \
- BOOST_PP_CAT(BOOST_FUSION_ADAPT_NAMED_STRUCT_X bseq, 0)) \
- /***/
-
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS(name, ns, newname, bseq) \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_I((ns)(name)(newname), \
- BOOST_PP_CAT(BOOST_FUSION_ADAPT_NAMED_STRUCT_X bseq, 0)) \
- /***/
-
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_X(x, y) ((x, y)) BOOST_FUSION_ADAPT_NAMED_STRUCT_Y
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_Y(x, y) ((x, y)) BOOST_FUSION_ADAPT_NAMED_STRUCT_X
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_X0
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_Y0
-
-// BOOST_FUSION_ADAPT_NAMED_STRUCT_I generates the overarching structure and uses
-// uses SEQ_FOR_EACH_I to generate the "linear" substructures.
-// Thanks to Paul Mensonides for the PP macro help
-
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_I(names, seq) \
- BOOST_PP_SEQ_FOR_EACH( \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_B, _, BOOST_PP_SEQ_ELEM(0, names)) \
- struct BOOST_PP_SEQ_ELEM(2, names) \
- { \
- BOOST_PP_SEQ_ELEM(2, names)(BOOST_PP_SEQ_ELEM(1, names)& s) \
- : s_(s) {} \
- BOOST_PP_SEQ_ELEM(1, names)& s_; \
- }; \
- BOOST_PP_SEQ_FOR_EACH( \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_E, _, BOOST_PP_SEQ_ELEM(0, names)) \
- namespace boost { namespace fusion { namespace traits \
- { \
- template <> \
- struct tag_of<BOOST_PP_SEQ_ELEM(2, names)> \
- { \
- typedef struct_tag type; \
- }; \
- }}} \
- \
- namespace boost { namespace mpl \
- { \
- template<typename> \
- struct sequence_tag; \
- \
- template<> \
- struct sequence_tag<BOOST_PP_SEQ_ELEM(2, names)> \
- { \
- typedef fusion::fusion_sequence_tag type; \
- }; \
- \
- template<> \
- struct sequence_tag<BOOST_PP_SEQ_ELEM(2, names) const> \
- { \
- typedef fusion::fusion_sequence_tag type; \
- }; \
- }} \
- \
- namespace boost { namespace fusion { namespace extension \
- { \
- template <> \
- struct struct_size<BOOST_PP_SEQ_ELEM(2, names)> \
- : mpl::int_<BOOST_PP_SEQ_SIZE(seq)> {}; \
- BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_NAMED_STRUCT_C, names, seq) \
- }}} \
- /***/
-
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_B(r, _, ns) namespace ns { \
- /***/
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_E(r, _, ns) } \
- /***/
-
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_C(r, names, i, xy) \
- template <> \
- struct struct_member<BOOST_PP_SEQ_ELEM(1, names), i> \
- { \
- typedef BOOST_PP_TUPLE_ELEM(2, 0, xy) type; \
- static type& call(BOOST_PP_SEQ_ELEM(1, names)& struct_) \
- { \
- return struct_.s_.BOOST_PP_TUPLE_ELEM(2, 1, xy); \
- } \
- }; \
- /***/
-
-#endif
-

Copied: trunk/boost/fusion/adapted/struct/adapt_struct_named.hpp (from r59335, /trunk/boost/fusion/adapted/struct/adapt_named_struct.hpp)
==============================================================================
--- /trunk/boost/fusion/adapted/struct/adapt_named_struct.hpp (original)
+++ trunk/boost/fusion/adapted/struct/adapt_struct_named.hpp 2010-01-28 20:58:50 EST (Thu, 28 Jan 2010)
@@ -5,8 +5,8 @@
     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_NAMED_ADAPT_STRUCT_SEP_29_2009_0748PM)
-#define BOOST_FUSION_NAMED_ADAPT_STRUCT_SEP_29_2009_0748PM
+#if !defined(BOOST_FUSION_ADAPT_STRUCT_NAMED_SEP_29_2009_0748PM)
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_SEP_29_2009_0748PM
 
 #include <boost/fusion/support/tag_of_fwd.hpp>
 #include <boost/fusion/adapted/struct/extension.hpp>
@@ -31,41 +31,41 @@
 #include <boost/preprocessor/cat.hpp>
 #include <boost/mpl/int.hpp>
 #include <boost/config/no_tr1/utility.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/add_const.hpp>
 
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT(name, newname, bseq) \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_I((())(name)(newname), \
- BOOST_PP_CAT(BOOST_FUSION_ADAPT_NAMED_STRUCT_X bseq, 0)) \
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED(name, newname, bseq) \
+ BOOST_FUSION_ADAPT_STRUCT_NAMED_I(name, (boost)(fusion)(adapted), newname, \
+ BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_NAMED_X bseq, 0)) \
     /***/
 
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS(name, ns, newname, bseq) \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_I((ns)(name)(newname), \
- BOOST_PP_CAT(BOOST_FUSION_ADAPT_NAMED_STRUCT_X bseq, 0)) \
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(name, ns, newname, bseq) \
+ BOOST_FUSION_ADAPT_STRUCT_NAMED_I(name, ns, newname, \
+ BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_NAMED_X bseq, 0)) \
     /***/
 
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_X(x, y) ((x, y)) BOOST_FUSION_ADAPT_NAMED_STRUCT_Y
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_Y(x, y) ((x, y)) BOOST_FUSION_ADAPT_NAMED_STRUCT_X
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_X0
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_Y0
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_X(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_NAMED_Y
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_Y(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_NAMED_X
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_X0
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_Y0
 
-// BOOST_FUSION_ADAPT_NAMED_STRUCT_I generates the overarching structure and uses
+// BOOST_FUSION_ADAPT_STRUCT_NAMED_I generates the overarching structure and uses
 // uses SEQ_FOR_EACH_I to generate the "linear" substructures.
 // Thanks to Paul Mensonides for the PP macro help
 
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_I(names, seq) \
- BOOST_PP_SEQ_FOR_EACH( \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_B, _, BOOST_PP_SEQ_ELEM(0, names)) \
- struct BOOST_PP_SEQ_ELEM(2, names) \
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_I(name, ns, newname, seq) \
+ BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_B, _, ns) \
+ struct newname \
         { \
- BOOST_PP_SEQ_ELEM(2, names)(BOOST_PP_SEQ_ELEM(1, names)& s) \
- : s_(s) {} \
- BOOST_PP_SEQ_ELEM(1, names)& s_; \
+ newname(name& s) : s_(s) {} \
+ name& s_; \
         }; \
- BOOST_PP_SEQ_FOR_EACH( \
- BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_E, _, BOOST_PP_SEQ_ELEM(0, names)) \
+ BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_E, _, ns) \
+ \
     namespace boost { namespace fusion { namespace traits \
     { \
         template <> \
- struct tag_of<BOOST_PP_SEQ_ELEM(2, names)> \
+ struct tag_of<BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname)> \
         { \
             typedef struct_tag type; \
         }; \
@@ -77,13 +77,13 @@
         struct sequence_tag; \
                                                                                 \
         template<> \
- struct sequence_tag<BOOST_PP_SEQ_ELEM(2, names)> \
+ struct sequence_tag<BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname)> \
         { \
             typedef fusion::fusion_sequence_tag type; \
         }; \
                                                                                 \
         template<> \
- struct sequence_tag<BOOST_PP_SEQ_ELEM(2, names) const> \
+ struct sequence_tag<BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname) const> \
         { \
             typedef fusion::fusion_sequence_tag type; \
         }; \
@@ -92,23 +92,32 @@
     namespace boost { namespace fusion { namespace extension \
     { \
         template <> \
- struct struct_size<BOOST_PP_SEQ_ELEM(2, names)> \
+ struct struct_size<BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname)> \
           : mpl::int_<BOOST_PP_SEQ_SIZE(seq)> {}; \
- BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_NAMED_STRUCT_C, names, seq) \
+ template <typename T, int N> struct class_member_proxy; \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_STRUCT_NAMED_C, \
+ (BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname), name), seq) \
     }}} \
     /***/
 
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_B(r, _, ns) namespace ns { \
- /***/
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_E(r, _, ns) } \
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname) \
+ BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_D, _, ns) \
+ newname \
     /***/
 
-#define BOOST_FUSION_ADAPT_NAMED_STRUCT_C(r, names, i, xy) \
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_B(r, _, ns) namespace ns {
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_D(r, _, ns) ns::
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_E(r, _, ns) }
+
+#define BOOST_FUSION_ADAPT_STRUCT_NAMED_C(r, names, i, xy) \
     template <> \
- struct struct_member<BOOST_PP_SEQ_ELEM(1, names), i> \
+ struct struct_member<BOOST_PP_TUPLE_ELEM(2, 0, names), i> \
     { \
- typedef BOOST_PP_TUPLE_ELEM(2, 0, xy) type; \
- static type& call(BOOST_PP_SEQ_ELEM(1, names)& struct_) \
+ typedef boost::mpl::if_< \
+ boost::is_const<BOOST_PP_TUPLE_ELEM(2, 1, names)> \
+ , boost::add_const<BOOST_PP_TUPLE_ELEM(2, 0, xy)>::type \
+ , BOOST_PP_TUPLE_ELEM(2, 0, xy)>::type type; \
+ static type& call(BOOST_PP_TUPLE_ELEM(2, 0, names)& struct_) \
         { \
             return struct_.s_.BOOST_PP_TUPLE_ELEM(2, 1, xy); \
         } \

Added: trunk/boost/fusion/include/adapt_struct_named.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/include/adapt_struct_named.hpp 2010-01-28 20:58:50 EST (Thu, 28 Jan 2010)
@@ -0,0 +1,12 @@
+/*=============================================================================
+ Copyright (c) 2001-2007 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_STRUCT_NAMED)
+#define FUSION_INCLUDE_ADAPT_STRUCT_NAMED
+
+#include <boost/fusion/adapted/struct/adapt_struct_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