Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r66411 - in trunk/boost/fusion: container/deque container/deque/detail container/vector/detail sequence/comparison/detail support support/detail
From: mr.chr.schmidt_at_[hidden]
Date: 2010-11-06 08:21:30


Author: cschmidt
Date: 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
New Revision: 66411
URL: http://svn.boost.org/trac/boost/changeset/66411

Log:
Fusion: removed fusion::sequence_root; Fixes #2335
Added:
   trunk/boost/fusion/container/deque/detail/is_sequence_impl.hpp (contents, props changed)
Text files modified:
   trunk/boost/fusion/container/deque/deque.hpp | 1 +
   trunk/boost/fusion/container/vector/detail/vector_n.hpp | 11 +++++------
   trunk/boost/fusion/sequence/comparison/detail/enable_comparison.hpp | 8 ++------
   trunk/boost/fusion/support/detail/is_mpl_sequence.hpp | 4 ++--
   trunk/boost/fusion/support/is_sequence.hpp | 7 +++++--
   trunk/boost/fusion/support/sequence_base.hpp | 13 +++++++++++--
   6 files changed, 26 insertions(+), 18 deletions(-)

Modified: trunk/boost/fusion/container/deque/deque.hpp
==============================================================================
--- trunk/boost/fusion/container/deque/deque.hpp (original)
+++ trunk/boost/fusion/container/deque/deque.hpp 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
@@ -27,6 +27,7 @@
 #include <boost/fusion/container/deque/detail/at_impl.hpp>
 #include <boost/fusion/container/deque/detail/begin_impl.hpp>
 #include <boost/fusion/container/deque/detail/end_impl.hpp>
+#include <boost/fusion/container/deque/detail/is_sequence_impl.hpp>
 #include <boost/fusion/sequence/intrinsic/begin.hpp>
 #include <boost/mpl/bool.hpp>
 

Added: trunk/boost/fusion/container/deque/detail/is_sequence_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/deque/detail/is_sequence_impl.hpp 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
@@ -0,0 +1,33 @@
+/*=============================================================================
+ Copyright (c) 2010 Christopher Schmidt
+
+ 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)
+==============================================================================*/
+
+#ifndef BOOST_FUSION_CONTAINER_DEQUE_DETAIL_IS_SEQUENCE_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_DEQUE_DETAIL_IS_SEQUENCE_IMPL_HPP
+
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace fusion
+{
+ struct deque_tag;
+
+ namespace extension
+ {
+ template<typename T>
+ struct is_sequence_impl;
+
+ template<>
+ struct is_sequence_impl<deque_tag>
+ {
+ template<typename Sequence>
+ struct apply
+ : mpl::true_
+ {};
+ };
+ }
+}}
+
+#endif

Modified: trunk/boost/fusion/container/vector/detail/vector_n.hpp
==============================================================================
--- trunk/boost/fusion/container/vector/detail/vector_n.hpp (original)
+++ trunk/boost/fusion/container/vector/detail/vector_n.hpp 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
@@ -36,8 +36,8 @@
 
 #define N BOOST_PP_ITERATION()
 
- template <typename Derived, BOOST_PP_ENUM_PARAMS(N, typename T)>
- struct BOOST_PP_CAT(vector_data, N) : sequence_base<Derived>
+ template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+ struct BOOST_PP_CAT(vector_data, N)
     {
         BOOST_PP_CAT(vector_data, N)()
             : BOOST_PP_ENUM(N, FUSION_MEMBER_DEFAULT_INIT, _) {}
@@ -73,12 +73,11 @@
 
     template <BOOST_PP_ENUM_PARAMS(N, typename T)>
     struct BOOST_PP_CAT(vector, N)
- : BOOST_PP_CAT(vector_data, N)<
- BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)>
- , BOOST_PP_ENUM_PARAMS(N, T)>
+ : BOOST_PP_CAT(vector_data, N)<BOOST_PP_ENUM_PARAMS(N, T)>
+ , sequence_base<BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> >
     {
         typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> this_type;
- typedef BOOST_PP_CAT(vector_data, N)<this_type, BOOST_PP_ENUM_PARAMS(N, T)> base_type;
+ typedef BOOST_PP_CAT(vector_data, N)<BOOST_PP_ENUM_PARAMS(N, T)> base_type;
         typedef mpl::BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> types;
         typedef vector_tag fusion_tag;
         typedef fusion_sequence_tag tag; // this gets picked up by MPL

Modified: trunk/boost/fusion/sequence/comparison/detail/enable_comparison.hpp
==============================================================================
--- trunk/boost/fusion/sequence/comparison/detail/enable_comparison.hpp (original)
+++ trunk/boost/fusion/sequence/comparison/detail/enable_comparison.hpp 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
@@ -13,22 +13,18 @@
 #include <boost/mpl/equal_to.hpp>
 #include <boost/fusion/support/is_sequence.hpp>
 #include <boost/fusion/sequence/intrinsic/size.hpp>
-#include <boost/fusion/support/detail/is_mpl_sequence.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
- template <typename Sequence>
- struct is_native_fusion_sequence : is_base_of<sequence_root, Sequence> {};
-
     template <typename Seq1, typename Seq2>
     struct enable_equality
- : mpl::or_<is_native_fusion_sequence<Seq1>, is_native_fusion_sequence<Seq2> >
+ : mpl::or_<traits::is_sequence<Seq1>, traits::is_sequence<Seq2> >
     {};
 
     template <typename Seq1, typename Seq2>
     struct enable_comparison
         : mpl::and_<
- mpl::or_<is_native_fusion_sequence<Seq1>, is_native_fusion_sequence<Seq2> >
+ mpl::or_<traits::is_sequence<Seq1>, traits::is_sequence<Seq2> >
           , mpl::equal_to<result_of::size<Seq1>, result_of::size<Seq2> >
>
     {};

Modified: trunk/boost/fusion/support/detail/is_mpl_sequence.hpp
==============================================================================
--- trunk/boost/fusion/support/detail/is_mpl_sequence.hpp (original)
+++ trunk/boost/fusion/support/detail/is_mpl_sequence.hpp 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
@@ -9,17 +9,17 @@
 #define FUSION_DETAIL_IS_MPL_SEQUENCE_29122006_1105
 
 #include <boost/fusion/support/sequence_base.hpp>
-#include <boost/type_traits/is_base_of.hpp>
 #include <boost/mpl/is_sequence.hpp>
 #include <boost/mpl/and.hpp>
 #include <boost/mpl/not.hpp>
+#include <boost/type_traits/is_convertible.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
     template <typename T>
     struct is_mpl_sequence
         : mpl::and_<
- mpl::not_<is_base_of<sequence_root, T> >
+ mpl::not_<is_convertible<T, from_sequence_convertible_type> >
           , mpl::is_sequence<T> >
     {};
 }}}

Modified: trunk/boost/fusion/support/is_sequence.hpp
==============================================================================
--- trunk/boost/fusion/support/is_sequence.hpp (original)
+++ trunk/boost/fusion/support/is_sequence.hpp 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
@@ -7,12 +7,13 @@
 #if !defined(FUSION_IS_SEQUENCE_05052005_1002)
 #define FUSION_IS_SEQUENCE_05052005_1002
 
-#include <boost/type_traits/is_base_of.hpp>
 #include <boost/fusion/support/sequence_base.hpp>
 #include <boost/fusion/support/tag_of.hpp>
 #include <boost/mpl/is_sequence.hpp>
 #include <boost/mpl/or.hpp>
 #include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_same.hpp>
 
 namespace boost { namespace fusion
 {
@@ -29,7 +30,9 @@
         struct is_sequence_impl
         {
             template <typename Sequence>
- struct apply : is_base_of<sequence_root, Sequence> {};
+ struct apply
+ : is_convertible<Sequence, detail::from_sequence_convertible_type>
+ {};
         };
 
         template <>

Modified: trunk/boost/fusion/support/sequence_base.hpp
==============================================================================
--- trunk/boost/fusion/support/sequence_base.hpp (original)
+++ trunk/boost/fusion/support/sequence_base.hpp 2010-11-06 08:21:18 EDT (Sat, 06 Nov 2010)
@@ -12,10 +12,14 @@
 
 namespace boost { namespace fusion
 {
- struct sequence_root {};
+ namespace detail
+ {
+ struct from_sequence_convertible_type
+ {};
+ }
 
     template <typename Sequence>
- struct sequence_base : sequence_root
+ struct sequence_base
     {
         Sequence const&
         derived() const
@@ -28,6 +32,11 @@
         {
             return static_cast<Sequence&>(*this);
         }
+
+ operator detail::from_sequence_convertible_type()const
+ {
+ return detail::from_sequence_convertible_type();
+ }
     };
 
     struct fusion_sequence_tag;


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