$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
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