$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r65446 - in sandbox/SOC/2009/fusion: boost/fusion/adapted/detail/adt boost/fusion/adapted/detail/struct boost/fusion/algorithm/iteration/detail boost/fusion/algorithm/query/detail boost/fusion/support libs/fusion/test/suite1/sequence
From: mr.chr.schmidt_at_[hidden]
Date: 2010-09-17 17:59:05
Author: cschmidt
Date: 2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
New Revision: 65446
URL: http://svn.boost.org/trac/boost/changeset/65446
Log:
adt_attribute_proxy refactorization
Text files modified: 
   sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/adt/adapt_base.hpp       |    73 ++++++++++++++++++++++++++++++--------- 
   sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/define_struct.hpp |    19 ++++++++-                               
   sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/extension.hpp     |     7 ++-                                     
   sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp |     6 +--                                     
   sandbox/SOC/2009/fusion/boost/fusion/algorithm/query/detail/all.hpp          |    54 ++++++++++++++++++++++-------           
   sandbox/SOC/2009/fusion/boost/fusion/support/config.hpp                      |     2                                         
   sandbox/SOC/2009/fusion/libs/fusion/test/suite1/sequence/adapt_adt.cpp       |    14 +++++++                                 
   7 files changed, 135 insertions(+), 40 deletions(-)
Modified: sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/adt/adapt_base.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/adt/adapt_base.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/adt/adapt_base.hpp	2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
@@ -15,6 +15,7 @@
 #include <boost/preprocessor/seq/elem.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/type_traits/is_const.hpp>
+#include <boost/utility/addressof.hpp>
 
 #define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL(TEMPLATE_PARAMS_SEQ)  \
     typename detail::get_identity<                                              \
@@ -33,7 +34,39 @@
     template<                                                                   \
         BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ)   \
     >                                                                           \
-    struct access::adt_attribute_proxy<                                         \
+    struct access::adt_attribute_access<                                        \
+        BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)                         \
+      , I                                                                       \
+    >                                                                           \
+    {                                                                           \
+        template<class Arg>                                                     \
+        static void                                                             \
+        boost_fusion_adapt_adt_impl_set(                                        \
+            BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj,               \
+            BOOST_FUSION_R_ELSE_CLREF(Arg) val)                                 \
+        {                                                                       \
+            BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 3, ATTRIBUTE);            \
+        }                                                                       \
+                                                                                \
+        static BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE)          \
+        boost_fusion_adapt_adt_impl_get(                                        \
+            BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj)               \
+        {                                                                       \
+            return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE);     \
+        }                                                                       \
+                                                                                \
+        static BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE)          \
+        boost_fusion_adapt_adt_impl_get(                                        \
+            BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj)         \
+        {                                                                       \
+            return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE);     \
+        }                                                                       \
+    };                                                                          \
+                                                                                \
+    template<                                                                   \
+        BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ)   \
+    >                                                                           \
+    struct adt_attribute_proxy<                                                 \
         BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)                         \
       , I                                                                       \
       , true                                                                    \
@@ -43,25 +76,25 @@
                                                                                 \
         explicit                                                                \
         adt_attribute_proxy(                                                    \
-            BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& o)           \
+            BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const*const o)      \
           : obj(o)                                                              \
         {}                                                                      \
                                                                                 \
         operator type() const                                                   \
         {                                                                       \
-            return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE);     \
+            return access::adt_attribute_access<                                \
+                BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)                 \
+              , I                                                               \
+            >::boost_fusion_adapt_adt_impl_get(*obj);                           \
         }                                                                       \
                                                                                 \
-        BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj;             \
-                                                                                \
-    private:                                                                    \
-        adt_attribute_proxy& operator= (adt_attribute_proxy const&);            \
+        BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const* obj;             \
     };                                                                          \
                                                                                 \
     template<                                                                   \
         BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ)   \
     >                                                                           \
-    struct access::adt_attribute_proxy<                                         \
+    struct adt_attribute_proxy<                                                 \
         BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)                         \
       , I                                                                       \
       , false                                                                   \
@@ -70,27 +103,33 @@
         typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) type;   \
                                                                                 \
         explicit                                                                \
-        adt_attribute_proxy(BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& o) \
+        adt_attribute_proxy(                                                    \
+            BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)*const o)            \
           : obj(o)                                                              \
         {}                                                                      \
                                                                                 \
         template<class Arg>                                                     \
         adt_attribute_proxy&                                                    \
-        operator=(Arg const& val)                                               \
+        operator=(BOOST_FUSION_R_ELSE_CLREF(Arg) val)                           \
         {                                                                       \
-            BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 3, ATTRIBUTE);            \
+            access::adt_attribute_access<                                       \
+                BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)                 \
+              , I                                                               \
+            >::boost_fusion_adapt_adt_impl_set(                                 \
+                *obj,                                                           \
+                BOOST_FUSION_FORWARD(Arg,val));                                 \
             return *this;                                                       \
         }                                                                       \
                                                                                 \
         operator type() const                                                   \
         {                                                                       \
-            return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE);     \
+            return access::adt_attribute_access<                                \
+                BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)                 \
+              , I                                                               \
+            >::boost_fusion_adapt_adt_impl_get(*obj);                           \
         }                                                                       \
                                                                                 \
-        BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj;                   \
-                                                                                \
-    private:                                                                    \
-        adt_attribute_proxy& operator= (adt_attribute_proxy const&);            \
+        BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)* obj;                   \
     };                                                                          \
                                                                                 \
     template<                                                                   \
@@ -129,7 +168,7 @@
             static type                                                         \
             call(SeqRef obj)                                                    \
             {                                                                   \
-                return type(obj);                                               \
+                return type(boost::addressof(obj));                             \
             }                                                                   \
         };                                                                      \
     };
Modified: sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/define_struct.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/define_struct.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/define_struct.hpp	2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
@@ -62,8 +62,9 @@
             BOOST_PP_TUPLE_ELEM(3,1,DATA))                                      \
     {}
 
-#define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I(                             \
-    R, ATTRIBUTE_TUPEL_SIZE, I_, ATTRIBUTE)                                     \
+#ifdef BOOST_NO_AUTO_DECLARATIONS
+#   define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I(                          \
+        R, ATTRIBUTE_TUPEL_SIZE, I_, ATTRIBUTE)                                 \
                                                                                 \
     BOOST_PP_EXPR_IF(                                                           \
         I_,                                                                     \
@@ -72,11 +73,23 @@
                 BOOST_PP_CAT(I,BOOST_PP_DEC(I_))&                               \
             >::type                                                             \
         BOOST_PP_CAT(I,I_);                                                     \
-        BOOST_PP_CAT(I,I_) BOOST_PP_CAT(i,I_)=                                  \
+        BOOST_PP_CAT(I,I_) const BOOST_PP_CAT(i,I_)=                            \
             boost::fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(I_)));)             \
                                                                                 \
     BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)=                      \
         boost::fusion::deref(BOOST_PP_CAT(i,I_));
+#else
+#   define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I(                          \
+        R, ATTRIBUTE_TUPEL_SIZE, I_, ATTRIBUTE)                                 \
+                                                                                \
+    BOOST_PP_EXPR_IF(                                                           \
+        I_,                                                                     \
+        auto const BOOST_PP_CAT(i,I_)=                                          \
+            boost::fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(I_)));)             \
+                                                                                \
+    BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)=                      \
+        boost::fusion::deref(BOOST_PP_CAT(i,I_));
+#endif
 
 #define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_OP(                                   \
     ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE)                                       \
Modified: sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/extension.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/extension.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/adapted/detail/struct/extension.hpp	2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
@@ -31,10 +31,13 @@
             template<typename Seq, int N>
             struct struct_member;
 
-            template<typename T, int N, bool Const>
-            struct adt_attribute_proxy;
+            template<typename Seq, int N>
+            struct adt_attribute_access;
         };
 
+        template <typename T, int N, bool Const>
+        struct adt_attribute_proxy;
+
         template<typename Seq, int N>
         struct struct_member_name;
 
Modified: sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/algorithm/iteration/detail/for_each.hpp	2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
@@ -21,7 +21,6 @@
 #include <boost/preprocessor/arithmetic/inc.hpp>
 #include <boost/preprocessor/comparison/equal.hpp>
 #include <boost/preprocessor/comparison/not_equal.hpp>
-#include <boost/preprocessor/control/expr_if.hpp>
 #include <boost/preprocessor/control/expr_iif.hpp>
 #include <boost/preprocessor/tuple/eat.hpp>
 #include <boost/preprocessor/repetition/repeat.hpp>
@@ -73,15 +72,14 @@
     {                                                                           \
         template<typename It0, typename F>                                      \
         static void                                                             \
-        call(                                                                   \
-            It0 const& BOOST_PP_EXPR_IF(N_,it0),                                \
-            BOOST_FUSION_RREF_ELSE_OBJ(F) BOOST_PP_EXPR_IF(N_,f))               \
+        call(It0 const& it0,BOOST_FUSION_RREF_ELSE_OBJ(F) f)                    \
         {                                                                       \
             BOOST_PP_REPEAT(                                                    \
                 BOOST_PP_DEC(N_),                                               \
                 BOOST_FUSION_UNROLLED_FOR_EACH_IMPL_N,_)                        \
                                                                                 \
             f(fusion::deref(BOOST_PP_CAT(it,BOOST_PP_DEC(N_))));                \
+                                                                                \
             BOOST_PP_IIF(                                                       \
                 BOOST_PP_EQUAL(N_,BOOST_FUSION_UNROLLED_DEPTH),                 \
                 BOOST_FUSION_UNROLLED_FOR_EACH_IMPL_NEXT,                       \
Modified: sandbox/SOC/2009/fusion/boost/fusion/algorithm/query/detail/all.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/algorithm/query/detail/all.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/algorithm/query/detail/all.hpp	2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
@@ -21,17 +21,29 @@
 #include <boost/preprocessor/arithmetic/inc.hpp>
 #include <boost/preprocessor/comparison/equal.hpp>
 #include <boost/preprocessor/comparison/not_equal.hpp>
-#include <boost/preprocessor/control/expr_if.hpp>
 #include <boost/preprocessor/control/expr_iif.hpp>
 #include <boost/preprocessor/tuple/eat.hpp>
 #include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
     template<int N>
     struct unrolled_all;
 
-#define BOOST_FUSION_UNROLLED_ALL_IMPL_N(Z,N,_)                                 \
+    template<>
+    struct unrolled_all<0>
+    {
+        template<typename It0, typename F>
+        static bool
+        call(It0 const&,BOOST_FUSION_RREF_ELSE_OBJ(F))
+        {
+            return true;
+        }
+    };
+
+#ifdef BOOST_NO_AUTO_DECLARATIONS
+#   define BOOST_FUSION_UNROLLED_ALL_IMPL_N(Z,N,_)                              \
     if(!f(fusion::deref(BOOST_PP_CAT(it,N))))                                   \
     {                                                                           \
         return false;                                                           \
@@ -42,39 +54,55 @@
     BOOST_PP_CAT(It,BOOST_PP_INC(N));                                           \
     BOOST_PP_CAT(It,BOOST_PP_INC(N)) const BOOST_PP_CAT(it,BOOST_PP_INC(N))(    \
         fusion::next(BOOST_PP_CAT(it,N)));
+#else
+#   define BOOST_FUSION_UNROLLED_ALL_IMPL_N(Z,N,_)                              \
+    if(!f(fusion::deref(BOOST_PP_CAT(it,N))))                                   \
+    {                                                                           \
+        return false;                                                           \
+    }                                                                           \
+                                                                                \
+    auto const BOOST_PP_CAT(it,BOOST_PP_INC(N))(                                \
+        fusion::next(BOOST_PP_CAT(it,N)));
+#endif
 
-#define BOOST_FUSION_UNROLLED_ALL_IMPL_LAST(_) true;
+#define BOOST_FUSION_UNROLLED_ALL_IMPL_LAST(_) true
 
 #define BOOST_FUSION_UNROLLED_ALL_IMPL_NEXT(N_)                                 \
     unrolled_all<N-BOOST_FUSION_UNROLLED_DEPTH>::call(                          \
         fusion::next(BOOST_PP_CAT(it,BOOST_PP_DEC(N_))),                        \
-        BOOST_FUSION_FORWARD(F,f));
+        BOOST_FUSION_FORWARD(F,f))
 
 #define BOOST_FUSION_UNROLLED_ALL_IMPL(Z,N_,_)                                  \
     template<BOOST_PP_EXPR_IIF(                                                 \
-        BOOST_PP_EQUAL(BOOST_PP_INC(N_),BOOST_FUSION_UNROLLED_DEPTH), int N)    \
+        BOOST_PP_EQUAL(N_,BOOST_FUSION_UNROLLED_DEPTH), int N)                  \
     >                                                                           \
     struct unrolled_all                                                         \
     BOOST_PP_EXPR_IIF(                                                          \
-        BOOST_PP_NOT_EQUAL(BOOST_PP_INC(N_),BOOST_FUSION_UNROLLED_DEPTH), <N_>) \
+        BOOST_PP_NOT_EQUAL(N_,BOOST_FUSION_UNROLLED_DEPTH), <N_>)               \
     {                                                                           \
         template<typename It0, typename F>                                      \
         static bool                                                             \
-        call(                                                                   \
-            It0 const& BOOST_PP_EXPR_IF(N_,it0),                                \
-            BOOST_FUSION_RREF_ELSE_OBJ(F) BOOST_PP_EXPR_IF(N_,f))               \
+        call(It0 const& it0,BOOST_FUSION_RREF_ELSE_OBJ(F) f)                    \
         {                                                                       \
-            BOOST_PP_REPEAT(N_,BOOST_FUSION_UNROLLED_ALL_IMPL_N,_)              \
+            BOOST_PP_REPEAT(                                                    \
+                BOOST_PP_DEC(N_),                                               \
+                BOOST_FUSION_UNROLLED_ALL_IMPL_N,_)                             \
+                                                                                \
+            if(!f(fusion::deref(BOOST_PP_CAT(it,BOOST_PP_DEC(N_)))))            \
+            {                                                                   \
+                return false;                                                   \
+            }                                                                   \
                                                                                 \
             return BOOST_PP_IIF(                                                \
                 BOOST_PP_EQUAL(N_,BOOST_FUSION_UNROLLED_DEPTH),                 \
                 BOOST_FUSION_UNROLLED_ALL_IMPL_NEXT,                            \
-                BOOST_FUSION_UNROLLED_ALL_IMPL_LAST)(N);                        \
+                BOOST_FUSION_UNROLLED_ALL_IMPL_LAST)(N_);                       \
         }                                                                       \
     };
 
-    BOOST_PP_REPEAT(
-        BOOST_FUSION_UNROLLED_DEPTH,
+    BOOST_PP_REPEAT_FROM_TO(
+        1,
+        BOOST_PP_INC(BOOST_FUSION_UNROLLED_DEPTH),
         BOOST_FUSION_UNROLLED_ALL_IMPL,
         _)
 
Modified: sandbox/SOC/2009/fusion/boost/fusion/support/config.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/support/config.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/support/config.hpp	2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
@@ -9,7 +9,7 @@
 #define BOOST_FUSION_SUPPORT_CONFIG_HPP
 
 #ifndef BOOST_FUSION_UNROLLED_DEPTH
-#   define BOOST_FUSION_UNROLLED_DEPTH 4
+#   define BOOST_FUSION_UNROLLED_DEPTH 6
 #endif
 
 #endif
Modified: sandbox/SOC/2009/fusion/libs/fusion/test/suite1/sequence/adapt_adt.cpp
==============================================================================
--- sandbox/SOC/2009/fusion/libs/fusion/test/suite1/sequence/adapt_adt.cpp	(original)
+++ sandbox/SOC/2009/fusion/libs/fusion/test/suite1/sequence/adapt_adt.cpp	2010-09-17 17:59:03 EDT (Fri, 17 Sep 2010)
@@ -28,6 +28,7 @@
 #include <boost/mpl/front.hpp>
 #include <boost/mpl/is_sequence.hpp>
 #include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
 #include <boost/static_assert.hpp>
 #include <iostream>
 #include <string>
@@ -173,6 +174,19 @@
     }
 #endif
 
+    {
+        BOOST_MPL_ASSERT((
+            boost::is_same<
+                result_of::front<ns::point>::type,
+                boost::fusion::extension::adt_attribute_proxy<ns::point,0,false>
+            >));
+        BOOST_MPL_ASSERT((
+            boost::is_same<
+                result_of::front<ns::point const>::type,
+                boost::fusion::extension::adt_attribute_proxy<ns::point,0,true>
+            >));
+    }
+
     return boost::report_errors();
 }