diff --git a/include/boost/fusion/container/deque/deque.hpp b/include/boost/fusion/container/deque/deque.hpp index 318cc96d..ffb1277e 100644 --- a/include/boost/fusion/container/deque/deque.hpp +++ b/include/boost/fusion/container/deque/deque.hpp @@ -50,7 +50,7 @@ namespace boost { namespace fusion typedef bidirectional_traversal_tag category; typedef mpl::int_<0> size; typedef mpl::int_<0> next_up; - typedef mpl::int_<0> next_down; + typedef mpl::int_<-1> next_down; typedef mpl::false_ is_view; template @@ -76,7 +76,7 @@ namespace boost { namespace fusion typedef typename detail::deque_keyed_values::type base; typedef mpl::int_<(sizeof ...(Tail) + 1)> size; typedef mpl::int_ next_up; - typedef mpl::int_<((size::value == 0) ? 0 : -1)> next_down; + typedef mpl::int_<-1> next_down; typedef mpl::false_ is_view; BOOST_FUSION_GPU_ENABLED @@ -122,16 +122,11 @@ namespace boost { namespace fusion #endif BOOST_FUSION_GPU_ENABLED - explicit deque(Head const& head, Tail const&... tail) + explicit deque(typename detail::call_param::type head + , typename detail::call_param::type... tail) : base(detail::deque_keyed_values::construct(head, tail...)) {} - template - BOOST_FUSION_GPU_ENABLED - explicit deque(Head_ const& head, Tail_ const&... tail) - : base(detail::deque_keyed_values::construct(head, tail...)) - {} - #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template >::type @@ -141,6 +136,14 @@ namespace boost { namespace fusion : base(detail::deque_keyed_values ::forward_(BOOST_FUSION_FWD_ELEM(Head_, head), BOOST_FUSION_FWD_ELEM(Tail_, tail)...)) {} +#else + template >::type + > + BOOST_FUSION_GPU_ENABLED + explicit deque(Head_ const& head, Tail_ const&... tail) + : base(detail::deque_keyed_values::construct(head, tail...)) + {} #endif template diff --git a/include/boost/fusion/container/deque/deque_fwd.hpp b/include/boost/fusion/container/deque/deque_fwd.hpp index 639c00e5..2f2a9fab 100644 --- a/include/boost/fusion/container/deque/deque_fwd.hpp +++ b/include/boost/fusion/container/deque/deque_fwd.hpp @@ -11,9 +11,8 @@ #include #include -#if (defined(BOOST_NO_CXX11_DECLTYPE) \ - || defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) \ - || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)) \ +#if (defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) \ + || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)) \ || (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)) # if defined(BOOST_FUSION_HAS_VARIADIC_DEQUE) # undef BOOST_FUSION_HAS_VARIADIC_DEQUE @@ -25,7 +24,7 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// With no decltype and variadics, we will use the C++03 version +// With no variadics, we will use the C++03 version /////////////////////////////////////////////////////////////////////////////// #if !defined(BOOST_FUSION_HAS_VARIADIC_DEQUE) # include diff --git a/include/boost/fusion/container/deque/deque_iterator.hpp b/include/boost/fusion/container/deque/deque_iterator.hpp index c61d6f97..f603b545 100644 --- a/include/boost/fusion/container/deque/deque_iterator.hpp +++ b/include/boost/fusion/container/deque/deque_iterator.hpp @@ -11,9 +11,14 @@ #include #include #include +#include #include #include +#include +#include #include +#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/container/deque/detail/begin_impl.hpp b/include/boost/fusion/container/deque/detail/begin_impl.hpp index 8e7f2633..c4eed54f 100644 --- a/include/boost/fusion/container/deque/detail/begin_impl.hpp +++ b/include/boost/fusion/container/deque/detail/begin_impl.hpp @@ -11,9 +11,6 @@ #include #include -#include -#include - namespace boost { namespace fusion { struct deque_tag; @@ -29,12 +26,8 @@ namespace boost { namespace fusion template struct apply { - typedef typename - mpl::if_c< - (Sequence::next_down::value == Sequence::next_up::value) - , deque_iterator - , deque_iterator - >::type + typedef + deque_iterator type; BOOST_FUSION_GPU_ENABLED diff --git a/include/boost/fusion/container/deque/detail/cpp03/deque.hpp b/include/boost/fusion/container/deque/detail/cpp03/deque.hpp index 3b9de662..1b92ceaf 100644 --- a/include/boost/fusion/container/deque/detail/cpp03/deque.hpp +++ b/include/boost/fusion/container/deque/detail/cpp03/deque.hpp @@ -18,12 +18,11 @@ #include #include #include +#include #include #include #include #include -#include -#include #include #include @@ -35,7 +34,6 @@ #include #include -#include #include #include @@ -76,8 +74,7 @@ namespace boost { namespace fusion { typedef typename detail::deque_keyed_values::type base; typedef typename detail::deque_initial_size::type size; typedef mpl::int_ next_up; - typedef mpl::int_< - mpl::if_ >, mpl::int_<0>, mpl::int_<-1> >::type::value> next_down; + typedef mpl::int_<-1> next_down; typedef mpl::false_ is_view; #include @@ -87,7 +84,7 @@ namespace boost { namespace fusion { {} BOOST_FUSION_GPU_ENABLED - explicit deque(typename add_reference::type>::type t0) + explicit deque(typename detail::call_param::type t0) : base(t0, detail::nil_keyed_element()) {} @@ -169,7 +166,7 @@ FUSION_HASH endif typedef bidirectional_traversal_tag category; typedef mpl::int_<0> size; typedef mpl::int_<0> next_up; - typedef mpl::int_<0> next_down; + typedef mpl::int_<-1> next_down; typedef mpl::false_ is_view; template diff --git a/include/boost/fusion/container/deque/detail/cpp03/deque_forward_ctor.hpp b/include/boost/fusion/container/deque/detail/cpp03/deque_forward_ctor.hpp index b62d4760..277811ec 100644 --- a/include/boost/fusion/container/deque/detail/cpp03/deque_forward_ctor.hpp +++ b/include/boost/fusion/container/deque/detail/cpp03/deque_forward_ctor.hpp @@ -36,7 +36,7 @@ FUSION_HASH if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \ (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)) BOOST_FUSION_GPU_ENABLED -deque(BOOST_PP_ENUM_BINARY_PARAMS(N, typename add_reference::type>::type t)) +deque(BOOST_PP_ENUM_BINARY_PARAMS(N, typename detail::call_param::type t)) : base(detail::deque_keyed_values::construct(BOOST_PP_ENUM_PARAMS(N, t))) {} #endif diff --git a/include/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp b/include/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp index 5fb1164a..8ba7eba0 100644 --- a/include/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp +++ b/include/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp @@ -35,7 +35,7 @@ #define N BOOST_PP_ITERATION() BOOST_FUSION_GPU_ENABLED - static type construct(BOOST_PP_ENUM_BINARY_PARAMS(N, typename add_reference::type>::type t)) + static type construct(BOOST_PP_ENUM_BINARY_PARAMS(N, typename detail::call_param::type t)) { return type(t0, deque_keyed_values_impl< diff --git a/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp b/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp index 0d3d3dea..efb2b90d 100644 --- a/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp +++ b/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp @@ -9,9 +9,8 @@ #define BOOST_FUSION_DEQUE_DETAIL_CPP11_DEQUE_KEYED_VALUES_07042012_1901 #include +#include #include -#include -#include #include namespace boost { namespace fusion { namespace detail @@ -39,7 +38,7 @@ namespace boost { namespace fusion { namespace detail , deque_keyed_values_impl::construct(tail...) ); } - +#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template BOOST_FUSION_GPU_ENABLED static type forward_(Head_&& head, Tail_&&... tail) @@ -50,6 +49,7 @@ namespace boost { namespace fusion { namespace detail forward_(BOOST_FUSION_FWD_ELEM(Tail_, tail)...) ); } +#endif }; struct nil_keyed_element; @@ -58,10 +58,14 @@ namespace boost { namespace fusion { namespace detail struct deque_keyed_values_impl { typedef nil_keyed_element type; + BOOST_FUSION_GPU_ENABLED static type construct() { return type(); } + +#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) BOOST_FUSION_GPU_ENABLED static type forward_() { return type(); } +#endif }; template diff --git a/include/boost/fusion/container/deque/detail/end_impl.hpp b/include/boost/fusion/container/deque/detail/end_impl.hpp index 73ef85ff..4ea344a9 100644 --- a/include/boost/fusion/container/deque/detail/end_impl.hpp +++ b/include/boost/fusion/container/deque/detail/end_impl.hpp @@ -11,9 +11,6 @@ #include #include -#include -#include - namespace boost { namespace fusion { struct deque_tag; @@ -29,12 +26,8 @@ namespace boost { namespace fusion template struct apply { - typedef typename - mpl::if_c< - (Sequence::next_down::value == Sequence::next_up::value) - , deque_iterator - , deque_iterator - >::type + typedef + deque_iterator type; BOOST_FUSION_GPU_ENABLED diff --git a/include/boost/fusion/container/map/detail/cpp03/map_forward_ctor.hpp b/include/boost/fusion/container/map/detail/cpp03/map_forward_ctor.hpp index d964cbe5..3938f9a4 100644 --- a/include/boost/fusion/container/map/detail/cpp03/map_forward_ctor.hpp +++ b/include/boost/fusion/container/map/detail/cpp03/map_forward_ctor.hpp @@ -31,7 +31,7 @@ #if N == 1 explicit #endif - map(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& arg)) + map(BOOST_PP_ENUM_BINARY_PARAMS(N, typename detail::call_param::type arg)) : data(BOOST_PP_ENUM_PARAMS(N, arg)) {} #undef N diff --git a/test/sequence/back_extended_deque.cpp b/test/sequence/back_extended_deque.cpp index edae9276..368ec0c2 100644 --- a/test/sequence/back_extended_deque.cpp +++ b/test/sequence/back_extended_deque.cpp @@ -23,6 +23,45 @@ int main() { using namespace boost::fusion; + { + typedef deque<> initial_deque_type; + initial_deque_type initial_deque; + typedef back_extended_deque extended_type; + extended_type extended(initial_deque, 101L); + + BOOST_TEST(size(extended) == 1); + BOOST_TEST(extended == make_vector(101L)); + BOOST_TEST(*begin(extended) == 101L); + BOOST_TEST(*prior(end(extended)) == 101L); + BOOST_TEST(distance(begin(extended), end(extended)) == 1); + } + { + namespace mpl = boost::mpl; + typedef deque<> initial_deque_type; + typedef back_extended_deque extended_type; + + BOOST_MPL_ASSERT((boost::is_same::type, long>)); + BOOST_MPL_ASSERT((boost::is_same::type>::type, long>)); + BOOST_MPL_ASSERT((mpl::equal_to::type, mpl::int_<1> >)); + } + { + long l(101L); + typedef deque<> initial_deque_type; + initial_deque_type initial_deque; + typedef back_extended_deque extended_type; + extended_type extended(initial_deque, l); + BOOST_TEST(extended == make_vector(101L)); + + long l2(202L); + extended_type extended2(initial_deque_type(), l2); + + extended = extended2; + + BOOST_TEST(extended == make_vector(202L)); + + BOOST_TEST(l == l2); + } + { typedef deque initial_deque_type; initial_deque_type initial_deque(1, 'a'); diff --git a/test/sequence/front_extended_deque.cpp b/test/sequence/front_extended_deque.cpp index d1c90343..cdbedeb3 100644 --- a/test/sequence/front_extended_deque.cpp +++ b/test/sequence/front_extended_deque.cpp @@ -23,6 +23,45 @@ int main() { using namespace boost::fusion; + { + typedef deque<> initial_deque_type; + initial_deque_type initial_deque; + typedef front_extended_deque extended_type; + extended_type extended(initial_deque, 1); + + BOOST_TEST(size(extended) == 1); + BOOST_TEST(extended == make_vector(1)); + BOOST_TEST(*begin(extended) == 1); + BOOST_TEST(*prior(end(extended)) == 1); + BOOST_TEST(distance(begin(extended), end(extended)) == 1); + } + { + namespace mpl = boost::mpl; + typedef deque<> initial_deque_type; + typedef front_extended_deque extended_type; + + BOOST_MPL_ASSERT((boost::is_same::type, int>)); + BOOST_MPL_ASSERT((boost::is_same::type>::type, int>)); + BOOST_MPL_ASSERT((mpl::equal_to::type, mpl::int_<1> >)); + } + { + int i(1); + typedef deque<> initial_deque_type; + initial_deque_type initial_deque; + typedef front_extended_deque extended_type; + extended_type extended(initial_deque, i); + BOOST_TEST(extended == make_vector(1)); + + int i2(2); + extended_type extended2(initial_deque_type(), i2); + + extended = extended2; + + BOOST_TEST(extended == make_vector(2)); + + BOOST_TEST(i == i2); + } + { typedef deque initial_deque_type; initial_deque_type initial_deque('a', 101L);