$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r80326 - trunk/boost/fusion/adapted/struct/detail
From: joel_at_[hidden]
Date: 2012-08-31 00:12:29
Author: djowel
Date: 2012-08-31 00:12:29 EDT (Fri, 31 Aug 2012)
New Revision: 80326
URL: http://svn.boost.org/trac/boost/changeset/80326
Log:
Fixed MSVC errors (from Nathan Ridge)
Text files modified: 
   trunk/boost/fusion/adapted/struct/detail/define_struct_inline.hpp |   228 ++++++++++++++++++++++----------------- 
   1 files changed, 128 insertions(+), 100 deletions(-)
Modified: trunk/boost/fusion/adapted/struct/detail/define_struct_inline.hpp
==============================================================================
--- trunk/boost/fusion/adapted/struct/detail/define_struct_inline.hpp	(original)
+++ trunk/boost/fusion/adapted/struct/detail/define_struct_inline.hpp	2012-08-31 00:12:29 EDT (Fri, 31 Aug 2012)
@@ -61,15 +61,20 @@
     BOOST_PP_COMMA_IF(N)                                                        \
     BOOST_FUSION_MAKE_INIT_LIST_ENTRY_I(BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE))
 
+#define BOOST_FUSION_ITERATOR_NAME(NAME)                                        \
+    BOOST_PP_CAT(boost_fusion_detail_, BOOST_PP_CAT(NAME, _iterator))
+
 // Note: all template parameter names need to be uglified, otherwise they might
 //       shadow a template parameter of the struct when used with
 //       BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE
 
 #define BOOST_FUSION_MAKE_ITERATOR_VALUE_OF_SPECS(Z, N, NAME)                   \
-    template <typename boost_fusion_uglified_Sq>                                \
-    struct value_of<NAME##_iterator<boost_fusion_uglified_Sq, N> >              \
+    template <typename boost_fusion_detail_Sq>                                  \
+    struct value_of<                                                            \
+               BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, N>      \
+           >                                                                    \
         : boost::mpl::identity<                                                 \
-              typename boost_fusion_uglified_Sq::t##N##_type                    \
+              typename boost_fusion_detail_Sq::t##N##_type                      \
           >                                                                     \
     {                                                                           \
     };
@@ -77,10 +82,10 @@
 #define BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC(                                  \
     SPEC_TYPE, CALL_ARG_TYPE, TYPE_QUAL, ATTRIBUTE, N)                          \
                                                                                 \
-    template <typename boost_fusion_uglified_Sq>                                \
+    template <typename boost_fusion_detail_Sq>                                  \
     struct deref<SPEC_TYPE, N> >                                                \
     {                                                                           \
-        typedef typename boost_fusion_uglified_Sq::t##N##_type TYPE_QUAL& type; \
+        typedef typename boost_fusion_detail_Sq::t##N##_type TYPE_QUAL& type;   \
         static type call(CALL_ARG_TYPE, N> const& iter)                         \
         {                                                                       \
             return iter.seq_.BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE);              \
@@ -89,48 +94,48 @@
 
 #define BOOST_FUSION_MAKE_ITERATOR_DEREF_SPECS(R, NAME, N, ATTRIBUTE)           \
     BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC(                                      \
-        BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq,                 \
-        BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq,                 \
+        BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq,                \
+        BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq,                \
         ,                                                                       \
         ATTRIBUTE,                                                              \
         N)                                                                      \
     BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC(                                      \
-        BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq,           \
-        BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq,           \
+        BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq,          \
+        BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq,          \
         const,                                                                  \
         ATTRIBUTE,                                                              \
         N)                                                                      \
     BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC(                                      \
-        const BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq,           \
-        BOOST_PP_CAT(NAME, _iterator)<boost_fusion_uglified_Sq,                 \
+        const BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq,          \
+        BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq,                \
         ,                                                                       \
         ATTRIBUTE,                                                              \
         N)                                                                      \
     BOOST_FUSION_MAKE_ITERATOR_DEREF_SPEC(                                      \
-        const BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq,     \
-        BOOST_PP_CAT(NAME, _iterator)<const boost_fusion_uglified_Sq,           \
+        const BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq,    \
+        BOOST_FUSION_ITERATOR_NAME(NAME)<const boost_fusion_detail_Sq,          \
         const,                                                                  \
         ATTRIBUTE,                                                              \
         N)                                                                      \
 
 #define BOOST_FUSION_MAKE_VALUE_AT_SPECS(Z, N, DATA)                            \
-    template <typename boost_fusion_uglified_Sq>                                \
-    struct value_at<boost_fusion_uglified_Sq, boost::mpl::int_<N> >             \
+    template <typename boost_fusion_detail_Sq>                                  \
+    struct value_at<boost_fusion_detail_Sq, boost::mpl::int_<N> >               \
     {                                                                           \
-        typedef typename boost_fusion_uglified_Sq::t##N##_type type;            \
+        typedef typename boost_fusion_detail_Sq::t##N##_type type;              \
     };
 
 #define BOOST_FUSION_MAKE_AT_SPECS(R, DATA, N, ATTRIBUTE)                       \
-    template <typename boost_fusion_uglified_Sq>                                \
-    struct at<boost_fusion_uglified_Sq, boost::mpl::int_<N> >                   \
+    template <typename boost_fusion_detail_Sq>                                  \
+    struct at<boost_fusion_detail_Sq, boost::mpl::int_<N> >                     \
     {                                                                           \
         typedef typename boost::mpl::if_<                                       \
-            boost::is_const<boost_fusion_uglified_Sq>,                          \
-            typename boost_fusion_uglified_Sq::t##N##_type const&,              \
-            typename boost_fusion_uglified_Sq::t##N##_type&                     \
+            boost::is_const<boost_fusion_detail_Sq>,                            \
+            typename boost_fusion_detail_Sq::t##N##_type const&,                \
+            typename boost_fusion_detail_Sq::t##N##_type&                       \
         >::type type;                                                           \
                                                                                 \
-        static type call(boost_fusion_uglified_Sq& sq)                          \
+        static type call(boost_fusion_detail_Sq& sq)                            \
         {                                                                       \
             return sq. BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE);                    \
         }                                                                       \
@@ -142,7 +147,11 @@
 #define BOOST_FUSION_MAKE_DATA_MEMBER(R, DATA, N, ATTRIBUTE)                    \
     BOOST_PP_TUPLE_ELEM(2, 0, ATTRIBUTE) BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE);
 
+// Note: We can't nest the iterator inside the struct because we run into
+//       a MSVC10 bug involving partial specializations of nested templates.
+
 #define BOOST_FUSION_DEFINE_STRUCT_INLINE_IMPL(NAME, ATTRIBUTES)                \
+    BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR(NAME, ATTRIBUTES)                \
     struct NAME : boost::fusion::sequence_facade<                               \
                       NAME,                                                     \
                       boost::fusion::random_access_traversal_tag                \
@@ -154,6 +163,8 @@
 #define BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE_IMPL(                             \
     TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES)                                      \
                                                                                 \
+    BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR(NAME, ATTRIBUTES)                \
+                                                                                \
     template <                                                                  \
         BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS_IMPL(                  \
             (0)TEMPLATE_PARAMS_SEQ)                                             \
@@ -179,170 +190,187 @@
         ATTRIBUTES_SEQ,                                                         \
         BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ))
 
-#define BOOST_FUSION_DEFINE_STRUCT_INLINE_MEMBERS_IMPL_IMPL(                    \
+#define BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR(NAME, ATTRIBUTES)            \
+    BOOST_FUSION_DEFINE_STRUCT_ITERATOR_IMPL(                                   \
+        NAME,                                                                   \
+        BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END))
+
+#define BOOST_FUSION_DEFINE_STRUCT_ITERATOR_IMPL(NAME, ATTRIBUTES_SEQ)          \
+    BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR_IMPL_IMPL(                       \
+        NAME,                                                                   \
+        ATTRIBUTES_SEQ,                                                         \
+        BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ))
+
+#define BOOST_FUSION_DEFINE_STRUCT_INLINE_ITERATOR_IMPL_IMPL(                   \
     NAME, ATTRIBUTES_SEQ, ATTRIBUTES_SEQ_SIZE)                                  \
                                                                                 \
-    NAME()                                                                      \
-        BOOST_PP_IF(                                                            \
-            BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ),                                  \
-            BOOST_FUSION_MAKE_DEFAULT_INIT_LIST,                                \
-            BOOST_FUSION_IGNORE_1)                                              \
-                (ATTRIBUTES_SEQ)                                                \
-    {                                                                           \
-    }                                                                           \
-                                                                                \
-    BOOST_PP_IF(                                                                \
-        BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ),                                      \
-        BOOST_FUSION_MAKE_COPY_CONSTRUCTOR,                                     \
-        BOOST_FUSION_IGNORE_2)                                                  \
-            (NAME, ATTRIBUTES_SEQ)                                              \
-                                                                                \
-    template <typename boost_fusion_uglified_Seq>                               \
-    NAME(const boost_fusion_uglified_Seq& rhs)                                  \
-    {                                                                           \
-        boost::fusion::copy(rhs, *this);                                        \
-    }                                                                           \
-                                                                                \
-    template <typename boost_fusion_uglified_Seq>                               \
-    NAME& operator=(const boost_fusion_uglified_Seq& rhs)                       \
-    {                                                                           \
-        boost::fusion::copy(rhs, *this);                                        \
-        return *this;                                                           \
-    }                                                                           \
-                                                                                \
-    template <typename boost_fusion_uglified_Seq, int N>                        \
-    struct NAME##_iterator                                                      \
+    template <typename boost_fusion_detail_Seq, int N>                          \
+    struct BOOST_FUSION_ITERATOR_NAME(NAME)                                     \
         : boost::fusion::iterator_facade<                                       \
-              NAME##_iterator<boost_fusion_uglified_Seq, N>,                    \
+              BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Seq, N>,     \
               boost::fusion::random_access_traversal_tag                        \
           >                                                                     \
     {                                                                           \
         typedef boost::mpl::int_<N> index;                                      \
-        typedef boost_fusion_uglified_Seq sequence_type;                        \
+        typedef boost_fusion_detail_Seq sequence_type;                          \
                                                                                 \
-        NAME##_iterator(boost_fusion_uglified_Seq& seq) : seq_(seq) {}          \
+        BOOST_FUSION_ITERATOR_NAME(NAME)(boost_fusion_detail_Seq& seq)          \
+            : seq_(seq) {}                                                      \
                                                                                 \
-        boost_fusion_uglified_Seq& seq_;                                        \
+        boost_fusion_detail_Seq& seq_;                                          \
                                                                                 \
-        template <typename boost_fusion_uglified_T> struct value_of;            \
+        template <typename boost_fusion_detail_T> struct value_of;              \
         BOOST_PP_REPEAT(                                                        \
             ATTRIBUTES_SEQ_SIZE,                                                \
             BOOST_FUSION_MAKE_ITERATOR_VALUE_OF_SPECS,                          \
             NAME)                                                               \
                                                                                 \
-        template <typename boost_fusion_uglified_T> struct deref;               \
+        template <typename boost_fusion_detail_T> struct deref;                 \
         BOOST_PP_SEQ_FOR_EACH_I(                                                \
             BOOST_FUSION_MAKE_ITERATOR_DEREF_SPECS,                             \
             NAME,                                                               \
             ATTRIBUTES_SEQ)                                                     \
                                                                                 \
-        template <typename boost_fusion_uglified_It>                            \
+        template <typename boost_fusion_detail_It>                              \
         struct next                                                             \
         {                                                                       \
-            typedef NAME##_iterator<                                            \
-                typename boost_fusion_uglified_It::sequence_type,               \
-                boost_fusion_uglified_It::index::value + 1                      \
+            typedef BOOST_FUSION_ITERATOR_NAME(NAME)<                           \
+                typename boost_fusion_detail_It::sequence_type,                 \
+                boost_fusion_detail_It::index::value + 1                        \
             > type;                                                             \
                                                                                 \
-            static type call(boost_fusion_uglified_It const& it)                \
+            static type call(boost_fusion_detail_It const& it)                  \
             {                                                                   \
                 return type(it.seq_);                                           \
             }                                                                   \
         };                                                                      \
                                                                                 \
-        template <typename boost_fusion_uglified_It>                            \
+        template <typename boost_fusion_detail_It>                              \
         struct prior                                                            \
         {                                                                       \
-            typedef NAME##_iterator<                                            \
-                typename boost_fusion_uglified_It::sequence_type,               \
-                boost_fusion_uglified_It::index::value - 1                      \
+            typedef BOOST_FUSION_ITERATOR_NAME(NAME)<                           \
+                typename boost_fusion_detail_It::sequence_type,                 \
+                boost_fusion_detail_It::index::value - 1                        \
             > type;                                                             \
                                                                                 \
-            static type call(boost_fusion_uglified_It const& it)                \
+            static type call(boost_fusion_detail_It const& it)                  \
             {                                                                   \
                 return type(it.seq_);                                           \
             }                                                                   \
         };                                                                      \
                                                                                 \
         template <                                                              \
-            typename boost_fusion_uglified_It1,                                 \
-            typename boost_fusion_uglified_It2                                  \
+            typename boost_fusion_detail_It1,                                   \
+            typename boost_fusion_detail_It2                                    \
         >                                                                       \
         struct distance                                                         \
         {                                                                       \
             typedef typename boost::mpl::minus<                                 \
-                typename boost_fusion_uglified_It2::index,                      \
-                typename boost_fusion_uglified_It1::index                       \
+                typename boost_fusion_detail_It2::index,                        \
+                typename boost_fusion_detail_It1::index                         \
             >::type type;                                                       \
                                                                                 \
-             static type call(boost_fusion_uglified_It1 const& it1,             \
-                              boost_fusion_uglified_It2 const& it2)             \
+             static type call(boost_fusion_detail_It1 const& it1,               \
+                              boost_fusion_detail_It2 const& it2)               \
             {                                                                   \
                 return type();                                                  \
             }                                                                   \
         };                                                                      \
                                                                                 \
         template <                                                              \
-            typename boost_fusion_uglified_It,                                  \
-            typename boost_fusion_uglified_M                                    \
+            typename boost_fusion_detail_It,                                    \
+            typename boost_fusion_detail_M                                      \
         >                                                                       \
         struct advance                                                          \
         {                                                                       \
-            typedef NAME##_iterator<                                            \
-                typename boost_fusion_uglified_It::sequence_type,               \
-                boost_fusion_uglified_It::index::value                          \
-                    + boost_fusion_uglified_M::value                            \
+            typedef BOOST_FUSION_ITERATOR_NAME(NAME)<                           \
+                typename boost_fusion_detail_It::sequence_type,                 \
+                boost_fusion_detail_It::index::value                            \
+                    + boost_fusion_detail_M::value                              \
             > type;                                                             \
                                                                                 \
-            static type call(boost_fusion_uglified_It const& it)                \
+            static type call(boost_fusion_detail_It const& it)                  \
             {                                                                   \
                 return type(it.seq_);                                           \
             }                                                                   \
         };                                                                      \
-    };                                                                          \
+    };
+
+
+#define BOOST_FUSION_DEFINE_STRUCT_INLINE_MEMBERS_IMPL_IMPL(                    \
+    NAME, ATTRIBUTES_SEQ, ATTRIBUTES_SEQ_SIZE)                                  \
+                                                                                \
+    NAME()                                                                      \
+        BOOST_PP_IF(                                                            \
+            BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ),                                  \
+            BOOST_FUSION_MAKE_DEFAULT_INIT_LIST,                                \
+            BOOST_FUSION_IGNORE_1)                                              \
+                (ATTRIBUTES_SEQ)                                                \
+    {                                                                           \
+    }                                                                           \
+                                                                                \
+    BOOST_PP_IF(                                                                \
+        BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ),                                      \
+        BOOST_FUSION_MAKE_COPY_CONSTRUCTOR,                                     \
+        BOOST_FUSION_IGNORE_2)                                                  \
+            (NAME, ATTRIBUTES_SEQ)                                              \
+                                                                                \
+    template <typename boost_fusion_detail_Seq>                                 \
+    NAME(const boost_fusion_detail_Seq& rhs)                                    \
+    {                                                                           \
+        boost::fusion::copy(rhs, *this);                                        \
+    }                                                                           \
+                                                                                \
+    template <typename boost_fusion_detail_Seq>                                 \
+    NAME& operator=(const boost_fusion_detail_Seq& rhs)                         \
+    {                                                                           \
+        boost::fusion::copy(rhs, *this);                                        \
+        return *this;                                                           \
+    }                                                                           \
                                                                                 \
-    template <typename boost_fusion_uglified_Sq>                                \
+    template <typename boost_fusion_detail_Sq>                                  \
     struct begin                                                                \
     {                                                                           \
-        typedef NAME##_iterator<boost_fusion_uglified_Sq, 0> type;              \
+        typedef BOOST_FUSION_ITERATOR_NAME(NAME)<boost_fusion_detail_Sq, 0>     \
+             type;                                                              \
                                                                                 \
-        static type call(boost_fusion_uglified_Sq& sq)                          \
+        static type call(boost_fusion_detail_Sq& sq)                            \
         {                                                                       \
             return type(sq);                                                    \
         }                                                                       \
     };                                                                          \
                                                                                 \
-    template <typename boost_fusion_uglified_Sq>                                \
+    template <typename boost_fusion_detail_Sq>                                  \
     struct end                                                                  \
     {                                                                           \
-        typedef NAME##_iterator<                                                \
-            boost_fusion_uglified_Sq,                                           \
+        typedef BOOST_FUSION_ITERATOR_NAME(NAME)<                               \
+            boost_fusion_detail_Sq,                                             \
             ATTRIBUTES_SEQ_SIZE                                                 \
         > type;                                                                 \
                                                                                 \
-        static type call(boost_fusion_uglified_Sq& sq)                          \
+        static type call(boost_fusion_detail_Sq& sq)                            \
         {                                                                       \
             return type(sq);                                                    \
         }                                                                       \
     };                                                                          \
                                                                                 \
-    template <typename boost_fusion_uglified_Sq>                                \
+    template <typename boost_fusion_detail_Sq>                                  \
     struct size : boost::mpl::int_<ATTRIBUTES_SEQ_SIZE>                         \
     {                                                                           \
     };                                                                          \
                                                                                 \
-    template <typename boost_fusion_uglified_Sq>                                \
+    template <typename boost_fusion_detail_Sq>                                  \
     struct empty : boost::mpl::bool_<ATTRIBUTES_SEQ_SIZE == 0>                  \
     {                                                                           \
     };                                                                          \
                                                                                 \
     template <                                                                  \
-        typename boost_fusion_uglified_Sq,                                      \
-        typename boost_fusion_uglified_N                                        \
+        typename boost_fusion_detail_Sq,                                        \
+        typename boost_fusion_detail_N                                          \
     >                                                                           \
     struct value_at : value_at<                                                 \
-                          boost_fusion_uglified_Sq,                             \
-                          boost::mpl::int_<boost_fusion_uglified_N::value>      \
+                          boost_fusion_detail_Sq,                               \
+                          boost::mpl::int_<boost_fusion_detail_N::value>        \
                       >                                                         \
     {                                                                           \
     };                                                                          \
@@ -353,12 +381,12 @@
         ~)                                                                      \
                                                                                 \
     template <                                                                  \
-        typename boost_fusion_uglified_Sq,                                      \
-        typename boost_fusion_uglified_N                                        \
+        typename boost_fusion_detail_Sq,                                        \
+        typename boost_fusion_detail_N                                          \
     >                                                                           \
     struct at : at<                                                             \
-                    boost_fusion_uglified_Sq,                                   \
-                    boost::mpl::int_<boost_fusion_uglified_N::value>            \
+                    boost_fusion_detail_Sq,                                     \
+                    boost::mpl::int_<boost_fusion_detail_N::value>              \
                 >                                                               \
     {                                                                           \
     };                                                                          \