#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
#include <boost/spirit/home/x3/support/traits/tuple_traits.hpp>
#include <boost/spirit/home/x3/support/traits/variant_has_substitute.hpp>
+
+#include <boost/assert.hpp>
#include <boost/fusion/include/is_sequence.hpp>
#include <boost/fusion/include/front.hpp>
#include <boost/fusion/include/move.hpp>
{
template <typename Source, typename Dest>
inline void
- move_to(Source&&, Dest&, unused_attribute) {}
+ move_to(Source&, Dest&, unused_attribute) {}
template <typename Source, typename Dest>
inline void
- move_to_plain(Source&& src, Dest& dest, mpl::false_) // src is not a single-element tuple
+ move_to_plain(Source& src, Dest& dest, mpl::false_) // src is not a single-element tuple
{
dest = std::move(src);
}
template <typename Source, typename Dest>
inline void
- move_to_plain(Source&& src, Dest& dest, mpl::true_) // src is a single-element tuple
+ move_to_plain(Source& src, Dest& dest, mpl::true_) // src is a single-element tuple
{
dest = std::move(fusion::front(src));
}
template <typename Source, typename Dest>
inline void
- move_to(Source&& src, Dest& dest, plain_attribute)
+ move_to(Source& src, Dest& dest, plain_attribute)
{
typename mpl::and_<
fusion::traits::is_sequence<Source>,
is_size_one_sequence<Source> >
is_single_element_sequence;
- move_to_plain(std::forward<Source>(src), dest, is_single_element_sequence);
+ move_to_plain(src, dest, is_single_element_sequence);
}
template <typename Source, typename Dest>
inline typename enable_if<is_container<Source>>::type
- move_to(Source&& src, Dest& dest, container_attribute)
+ move_to(Source& src, Dest& dest, container_attribute)
{
traits::move_to(src.begin(), src.end(), dest);
}
is_same_size_sequence<Dest, Source>,
mpl::not_<is_size_one_sequence<Dest> > >
>::type
- move_to(Source&& src, Dest& dest, tuple_attribute)
+ move_to(Source& src, Dest& dest, tuple_attribute)
{
- fusion::move(std::forward<Source>(src), dest);
+ fusion::move(std::move(src), dest);
}
template <typename Source, typename Dest>
inline typename enable_if<
is_size_one_sequence<Dest>
>::type
- move_to(Source&& src, Dest& dest, tuple_attribute)
+ move_to(Source& src, Dest& dest, tuple_attribute)
{
- traits::move_to(std::forward<Source>(src), fusion::front(dest));
+ traits::move_to(src, fusion::front(dest));
}
template <typename Source, typename Dest>
inline void
- move_to(Source&& src, Dest& dest, variant_attribute, mpl::false_)
+ move_to(Source& src, Dest& dest, variant_attribute, mpl::false_)
{
dest = std::move(src);
}
template <typename Source, typename Dest>
inline void
- move_to_variant_from_single_element_sequence(Source&& src, Dest& dest, mpl::false_)
+ move_to_variant_from_single_element_sequence(Source& src, Dest& dest, mpl::false_)
{
// dest is a variant, src is a single element fusion sequence that the variant
// cannot directly hold. We'll try to unwrap the single element fusion sequence.
template <typename Source, typename Dest>
inline void
- move_to_variant_from_single_element_sequence(Source&& src, Dest& dest, mpl::true_)
+ move_to_variant_from_single_element_sequence(Source& src, Dest& dest, mpl::true_)
{
// dest is a variant, src is a single element fusion sequence that the variant
// *can* directly hold.
template <typename Source, typename Dest>
inline void
- move_to(Source&& src, Dest& dest, variant_attribute, mpl::true_)
+ move_to(Source& src, Dest& dest, variant_attribute, mpl::true_)
{
move_to_variant_from_single_element_sequence(src, dest, variant_has_substitute<Dest, Source>());
}
template <typename Source, typename Dest>
inline void
- move_to(Source&& src, Dest& dest, variant_attribute tag)
+ move_to(Source& src, Dest& dest, variant_attribute tag)
{
move_to(src, dest, tag, is_size_one_sequence<Source>());
}
template <typename Source, typename Dest>
inline void
- move_to(Source&& src, Dest& dest, optional_attribute)
+ move_to(Source& src, Dest& dest, optional_attribute)
{
dest = std::move(src);
}
}
}
- template <typename Source, typename Dest>
- inline void move_to(boost::optional<Source>&& src, Dest& dest)
- {
- if (src) detail::move_to(std::move(*src), dest
- , typename attribute_category<Dest>::type());
- }
-
template <typename Source, typename Dest>
inline void move_to(Source&& src, Dest& dest)
{
- detail::move_to(std::move(src), dest
- , typename attribute_category<Dest>::type());
+ detail::move_to(src, dest, typename attribute_category<Dest>::type());
}
template <typename T>
inline void move_to(T& src, T& dest)
{
- if (boost::addressof(src) != boost::addressof(dest))
- dest = std::move(src);
+ BOOST_ASSERT(boost::addressof(src) != boost::addressof(dest));
+ dest = std::move(src);
}
template <typename T>
inline void move_to(T const& src, T& dest)
{
- if (boost::addressof(src) != boost::addressof(dest))
- dest = std::move(src);
+ BOOST_ASSERT(boost::addressof(src) != boost::addressof(dest));
+ dest = src;
}
template <typename T>
inline void move_to(T&& src, T& dest)
{
- if (boost::addressof(src) != boost::addressof(dest))
- dest = std::move(src);
+ BOOST_ASSERT(boost::addressof(src) != boost::addressof(dest));
+ dest = std::move(src);
}
template <typename Iterator, typename Dest>