deque move-ctor OK on gcc

[SVN r80334]
This commit is contained in:
Joel de Guzman
2012-08-31 15:58:31 +00:00
parent 5946ab9936
commit 3613310b62
3 changed files with 34 additions and 11 deletions

View File

@ -71,6 +71,11 @@ namespace boost { namespace fusion
: base(seq) : base(seq)
{} {}
template <typename ...Elements>
deque(deque<Elements...>& seq)
: base(seq)
{}
#if !defined(BOOST_NO_RVALUE_REFERENCES) #if !defined(BOOST_NO_RVALUE_REFERENCES)
template <typename ...Elements> template <typename ...Elements>
deque(deque<Elements...>&& seq) deque(deque<Elements...>&& seq)
@ -89,16 +94,21 @@ namespace boost { namespace fusion
#endif #endif
explicit deque(Head const& head, Tail const&... tail) explicit deque(Head const& head, Tail const&... tail)
: base(detail::deque_keyed_values<Head, Tail...>::call(head, tail...)) : base(detail::deque_keyed_values<Head, Tail...>::construct(head, tail...))
{} {}
//~ #if !defined(BOOST_NO_RVALUE_REFERENCES) template <typename Head_, typename ...Tail_>
//~ template <typename Head_, typename ...Tail_> explicit deque(Head_ const& head, Tail_ const&... tail)
//~ explicit deque(Head_&& head, Tail_&&... tail) : base(detail::deque_keyed_values<Head_, Tail_...>::construct(head, tail...))
//~ : base(detail::deque_keyed_values<Head_, Tail_...> {}
//~ ::call(std::forward<Head_>(head), std::forward<Tail_>(tail)...))
//~ {} #if !defined(BOOST_NO_RVALUE_REFERENCES)
//~ #endif template <typename Head_, typename ...Tail_>
explicit deque(Head_&& head, Tail_&&... tail)
: base(detail::deque_keyed_values<Head, Tail...>
::forward_(std::forward<Head_>(head), std::forward<Tail_>(tail)...))
{}
#endif
template <typename Sequence> template <typename Sequence>
explicit deque(Sequence const& seq explicit deque(Sequence const& seq

View File

@ -28,13 +28,22 @@ namespace boost { namespace fusion { namespace detail
typedef typename deque_keyed_values_impl<next_index, Tail...>::type tail; typedef typename deque_keyed_values_impl<next_index, Tail...>::type tail;
typedef keyed_element<N, Head, tail> type; typedef keyed_element<N, Head, tail> type;
static type call( static type construct(
typename detail::call_param<Head>::type head typename detail::call_param<Head>::type head
, typename detail::call_param<Tail>::type... tail) , typename detail::call_param<Tail>::type... tail)
{ {
return type( return type(
head head
, deque_keyed_values_impl<next_index, Tail...>::call(tail...) , deque_keyed_values_impl<next_index, Tail...>::construct(tail...)
);
}
static type forward_(Head&& head, Tail&&... tail)
{
return type(
std::forward<Head>(head)
, deque_keyed_values_impl<next_index, Tail...>::
forward_(std::forward<Tail>(tail)...)
); );
} }
}; };
@ -45,7 +54,8 @@ namespace boost { namespace fusion { namespace detail
struct deque_keyed_values_impl<N> struct deque_keyed_values_impl<N>
{ {
typedef nil_keyed_element type; typedef nil_keyed_element type;
static type call() { return type(); } static type construct() { return type(); }
static type forward_() { return type(); }
}; };
template <typename ...Elements> template <typename ...Elements>

View File

@ -63,6 +63,9 @@ namespace boost { namespace fusion { namespace detail
: Rest(rhs.get_base()), value_(rhs.value_) : Rest(rhs.get_base()), value_(rhs.value_)
{} {}
#if !defined(BOOST_NO_RVALUE_REFERENCES)
#endif
Rest& get_base() Rest& get_base()
{ {
return *this; return *this;