/*============================================================================= Copyright (c) 2001-2013 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #if !defined(FUSION_MOVE_01192013_2225) #define FUSION_MOVE_01192013_2225 #include #include #include #include #include #include #include #include #include #include #include // for std::move #if defined (BOOST_MSVC) # pragma warning(push) # pragma warning (disable: 4100) // unreferenced formal parameter #endif namespace boost { namespace fusion { namespace detail { template struct sequence_move { typedef typename result_of::end::type end1_type; typedef typename result_of::end::type end2_type; template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static void call(I1 const&, I2 const&, mpl::true_) { } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static void call(I1 const& src, I2 const& dest, mpl::false_) { *dest = std::move(*src); call(fusion::next(src), fusion::next(dest)); } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static void call(I1 const& src, I2 const& dest) { typename result_of::equal_to::type eq; return call(src, dest, eq); } }; } namespace result_of { template struct move : enable_if, traits::is_sequence > > {}; } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED inline typename result_of::move::type move(Seq1&& src, Seq2& dest) { BOOST_STATIC_ASSERT( result_of::size::value <= result_of::size::value); detail::sequence_move< Seq1, Seq2>:: call(fusion::begin(src), fusion::begin(dest)); } }} #if defined (BOOST_MSVC) # pragma warning(pop) #endif #endif