diff options
Diffstat (limited to 'boost/fusion/container/deque/deque.hpp')
-rw-r--r-- | boost/fusion/container/deque/deque.hpp | 81 |
1 files changed, 46 insertions, 35 deletions
diff --git a/boost/fusion/container/deque/deque.hpp b/boost/fusion/container/deque/deque.hpp index 6fd3e1b0ce..96919052e7 100644 --- a/boost/fusion/container/deque/deque.hpp +++ b/boost/fusion/container/deque/deque.hpp @@ -50,20 +50,20 @@ 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 <typename Sequence> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED deque(Sequence const&, typename enable_if< mpl::and_< traits::is_sequence<Sequence> - , result_of::empty<Sequence>>>::type* /*dummy*/ = 0) + , result_of::empty<Sequence>>>::type* /*dummy*/ = 0) BOOST_NOEXCEPT {} - BOOST_FUSION_GPU_ENABLED - deque() {} + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + deque() BOOST_NOEXCEPT {} }; template <typename Head, typename ...Tail> @@ -76,74 +76,85 @@ namespace boost { namespace fusion typedef typename detail::deque_keyed_values<Head, Tail...>::type base; typedef mpl::int_<(sizeof ...(Tail) + 1)> size; typedef mpl::int_<size::value> 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 + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED deque() {} - template <typename ...Elements> - BOOST_FUSION_GPU_ENABLED - deque(deque<Elements...> const& seq) + template <typename Head_, typename ...Tail_, typename = + typename enable_if<is_convertible<Head_, Head> >::type + > + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + deque(deque<Head_, Tail_...> const& seq) : base(seq) {} - template <typename ...Elements> - BOOST_FUSION_GPU_ENABLED - deque(deque<Elements...>& seq) + template <typename Head_, typename ...Tail_, typename = + typename enable_if<is_convertible<Head_, Head> >::type + > + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + deque(deque<Head_, Tail_...>& seq) : base(seq) {} #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) - template <typename ...Elements> - BOOST_FUSION_GPU_ENABLED - deque(deque<Elements...>&& seq) - : base(std::forward<deque<Elements...>>(seq)) + template <typename Head_, typename ...Tail_, typename = + typename enable_if<is_convertible<Head_, Head> >::type + > + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED + deque(deque<Head_, Tail_...>&& seq) + : base(std::forward<deque<Head_, Tail_...>>(seq)) {} #endif - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED deque(deque const& seq) : base(seq) {} #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED deque(deque&& seq) : base(std::forward<deque>(seq)) {} #endif - BOOST_FUSION_GPU_ENABLED - explicit deque(Head const& head, Tail const&... tail) + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + explicit deque(typename detail::call_param<Head>::type head + , typename detail::call_param<Tail>::type... tail) : base(detail::deque_keyed_values<Head, Tail...>::construct(head, tail...)) {} - template <typename Head_, typename ...Tail_> - BOOST_FUSION_GPU_ENABLED - explicit deque(Head_ const& head, Tail_ const&... tail) - : base(detail::deque_keyed_values<Head_, Tail_...>::construct(head, tail...)) - {} - #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) - template <typename Head_, typename ...Tail_> - BOOST_FUSION_GPU_ENABLED + template <typename Head_, typename ...Tail_, typename = + typename enable_if<is_convertible<Head_, Head> >::type + > + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED explicit deque(Head_&& head, Tail_&&... tail) : base(detail::deque_keyed_values<Head, Tail...> - ::forward_(std::forward<Head_>(head), std::forward<Tail_>(tail)...)) + ::forward_(BOOST_FUSION_FWD_ELEM(Head_, head), BOOST_FUSION_FWD_ELEM(Tail_, tail)...)) + {} +#else + template <typename Head_, typename ...Tail_, typename = + typename enable_if<is_convertible<Head_, Head> >::type + > + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + explicit deque(Head_ const& head, Tail_ const&... tail) + : base(detail::deque_keyed_values<Head_, Tail_...>::construct(head, tail...)) {} #endif template <typename Sequence> - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED explicit deque(Sequence const& seq , typename disable_if<is_convertible<Sequence, Head> >::type* /*dummy*/ = 0) : base(base::from_iterator(fusion::begin(seq))) {} template <typename ...Elements> - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED deque& operator=(deque<Elements...> const& rhs) { base::operator=(rhs); @@ -151,7 +162,7 @@ namespace boost { namespace fusion } template <typename T> - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED deque& operator=(T const& rhs) { base::operator=(rhs); @@ -160,10 +171,10 @@ namespace boost { namespace fusion #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template <typename T> - BOOST_FUSION_GPU_ENABLED + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED deque& operator=(T&& rhs) { - base::operator=(std::forward<T>(rhs)); + base::operator=(BOOST_FUSION_FWD_ELEM(T, rhs)); return *this; } #endif |