From aa4d67258bbd3eced0b3f3f382a7a6a9d7885349 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Thu, 20 Nov 2014 18:42:23 +0900 Subject: [PATCH 1/5] Fixed for non rv-ref supporting compiler. --- .../fusion/container/deque/detail/deque_keyed_values.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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..6c09730d 100644 --- a/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp +++ b/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp @@ -39,7 +39,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 +50,7 @@ namespace boost { namespace fusion { namespace detail forward_(BOOST_FUSION_FWD_ELEM(Tail_, tail)...) ); } +#endif }; struct nil_keyed_element; @@ -58,10 +59,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 From d185bd5df6f41db418171c67e9c395b71c99feeb Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Fri, 21 Nov 2014 00:53:50 +0900 Subject: [PATCH 2/5] Use call_param for deducing type better. --- include/boost/fusion/container/deque/deque.hpp | 3 ++- include/boost/fusion/container/deque/deque_iterator.hpp | 5 +++++ include/boost/fusion/container/deque/detail/cpp03/deque.hpp | 6 ++---- .../container/deque/detail/cpp03/deque_forward_ctor.hpp | 2 +- .../deque/detail/cpp03/deque_keyed_values_call.hpp | 2 +- .../fusion/container/deque/detail/deque_keyed_values.hpp | 3 +-- .../fusion/container/map/detail/cpp03/map_forward_ctor.hpp | 2 +- 7 files changed, 13 insertions(+), 10 deletions(-) diff --git a/include/boost/fusion/container/deque/deque.hpp b/include/boost/fusion/container/deque/deque.hpp index 318cc96d..06fca37b 100644 --- a/include/boost/fusion/container/deque/deque.hpp +++ b/include/boost/fusion/container/deque/deque.hpp @@ -122,7 +122,8 @@ 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...)) {} 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/cpp03/deque.hpp b/include/boost/fusion/container/deque/detail/cpp03/deque.hpp index 3b9de662..967d8f48 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 @@ -87,7 +85,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()) {} 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 6c09730d..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 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 From d05b854c589690ea08dc373cfe1cfb1fdbd4ebd2 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sun, 30 Nov 2014 02:27:47 +0900 Subject: [PATCH 3/5] Correct variadic based fusion::deque requirements --- include/boost/fusion/container/deque/deque_fwd.hpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 From ed9880c1612840cee487eb0fb38e119e6f95e8ee Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sun, 30 Nov 2014 03:58:20 +0900 Subject: [PATCH 4/5] Fix out of bounds access within {front|back}_extended_deque with empty deque. The insertion point is not correct with empty deque since the range {next_down, next_up} is not half-open range. --- .../boost/fusion/container/deque/deque.hpp | 4 +- .../container/deque/detail/begin_impl.hpp | 11 +----- .../container/deque/detail/cpp03/deque.hpp | 5 +-- .../container/deque/detail/end_impl.hpp | 11 +----- test/sequence/back_extended_deque.cpp | 39 +++++++++++++++++++ test/sequence/front_extended_deque.cpp | 39 +++++++++++++++++++ 6 files changed, 86 insertions(+), 23 deletions(-) diff --git a/include/boost/fusion/container/deque/deque.hpp b/include/boost/fusion/container/deque/deque.hpp index 06fca37b..fdcc73ae 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 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 967d8f48..1b92ceaf 100644 --- a/include/boost/fusion/container/deque/detail/cpp03/deque.hpp +++ b/include/boost/fusion/container/deque/detail/cpp03/deque.hpp @@ -74,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 @@ -167,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/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/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); From 223c7d520f85971b4c5439b6b2b0592a1286790d Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sun, 30 Nov 2014 14:29:03 +0900 Subject: [PATCH 5/5] Fix overload resolution failure. Because the ctor `deque(U &&...)` is also performed as `deque(U const&...)`. --- include/boost/fusion/container/deque/deque.hpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/include/boost/fusion/container/deque/deque.hpp b/include/boost/fusion/container/deque/deque.hpp index fdcc73ae..ffb1277e 100644 --- a/include/boost/fusion/container/deque/deque.hpp +++ b/include/boost/fusion/container/deque/deque.hpp @@ -127,12 +127,6 @@ namespace boost { namespace fusion : 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 @@ -142,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