diff --git a/include/boost/fusion/container/deque/deque.hpp b/include/boost/fusion/container/deque/deque.hpp index b5c9edd8..c26a226c 100644 --- a/include/boost/fusion/container/deque/deque.hpp +++ b/include/boost/fusion/container/deque/deque.hpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include diff --git a/include/boost/fusion/container/deque/detail/is_sequence_impl.hpp b/include/boost/fusion/container/deque/detail/is_sequence_impl.hpp new file mode 100644 index 00000000..ff88ed6f --- /dev/null +++ b/include/boost/fusion/container/deque/detail/is_sequence_impl.hpp @@ -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 + +namespace boost { namespace fusion +{ + struct deque_tag; + + namespace extension + { + template + struct is_sequence_impl; + + template<> + struct is_sequence_impl + { + template + struct apply + : mpl::true_ + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/vector_n.hpp b/include/boost/fusion/container/vector/detail/vector_n.hpp index ea314ac2..33484c5d 100644 --- a/include/boost/fusion/container/vector/detail/vector_n.hpp +++ b/include/boost/fusion/container/vector/detail/vector_n.hpp @@ -36,8 +36,8 @@ #define N BOOST_PP_ITERATION() - template - struct BOOST_PP_CAT(vector_data, N) : sequence_base + template + 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 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_CAT(vector_data, N) + , sequence_base > { typedef BOOST_PP_CAT(vector, N) this_type; - typedef BOOST_PP_CAT(vector_data, N) base_type; + typedef BOOST_PP_CAT(vector_data, N) base_type; typedef mpl::BOOST_PP_CAT(vector, N) types; typedef vector_tag fusion_tag; typedef fusion_sequence_tag tag; // this gets picked up by MPL diff --git a/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp b/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp index 3e79277e..93d01506 100644 --- a/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp +++ b/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp @@ -13,22 +13,18 @@ #include #include #include -#include namespace boost { namespace fusion { namespace detail { - template - struct is_native_fusion_sequence : is_base_of {}; - template struct enable_equality - : mpl::or_, is_native_fusion_sequence > + : mpl::or_, traits::is_sequence > {}; template struct enable_comparison : mpl::and_< - mpl::or_, is_native_fusion_sequence > + mpl::or_, traits::is_sequence > , mpl::equal_to, result_of::size > > {}; diff --git a/include/boost/fusion/support/detail/is_mpl_sequence.hpp b/include/boost/fusion/support/detail/is_mpl_sequence.hpp index eeb8f916..b7e792b3 100644 --- a/include/boost/fusion/support/detail/is_mpl_sequence.hpp +++ b/include/boost/fusion/support/detail/is_mpl_sequence.hpp @@ -9,17 +9,17 @@ #define FUSION_DETAIL_IS_MPL_SEQUENCE_29122006_1105 #include -#include #include #include #include +#include namespace boost { namespace fusion { namespace detail { template struct is_mpl_sequence : mpl::and_< - mpl::not_ > + mpl::not_ > , mpl::is_sequence > {}; }}} diff --git a/include/boost/fusion/support/is_sequence.hpp b/include/boost/fusion/support/is_sequence.hpp index d57cecb4..4dc9bdd8 100644 --- a/include/boost/fusion/support/is_sequence.hpp +++ b/include/boost/fusion/support/is_sequence.hpp @@ -7,12 +7,13 @@ #if !defined(FUSION_IS_SEQUENCE_05052005_1002) #define FUSION_IS_SEQUENCE_05052005_1002 -#include #include #include #include #include #include +#include +#include namespace boost { namespace fusion { @@ -29,7 +30,9 @@ namespace boost { namespace fusion struct is_sequence_impl { template - struct apply : is_base_of {}; + struct apply + : is_convertible + {}; }; template <> diff --git a/include/boost/fusion/support/sequence_base.hpp b/include/boost/fusion/support/sequence_base.hpp index 1d436ef1..9a5186df 100644 --- a/include/boost/fusion/support/sequence_base.hpp +++ b/include/boost/fusion/support/sequence_base.hpp @@ -12,10 +12,14 @@ namespace boost { namespace fusion { - struct sequence_root {}; + namespace detail + { + struct from_sequence_convertible_type + {}; + } template - struct sequence_base : sequence_root + struct sequence_base { Sequence const& derived() const @@ -28,6 +32,11 @@ namespace boost { namespace fusion { return static_cast(*this); } + + operator detail::from_sequence_convertible_type()const + { + return detail::from_sequence_convertible_type(); + } }; struct fusion_sequence_tag;