Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // (C) Copyright Ion Gaztanaga 2012-2012. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/move for documentation. Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: //! \file Chris@16: Chris@16: #ifndef BOOST_MOVE_ALGORITHM_HPP Chris@16: #define BOOST_MOVE_ALGORITHM_HPP Chris@16: Chris@101: #ifndef BOOST_CONFIG_HPP Chris@101: # include Chris@101: #endif Chris@101: # Chris@101: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@101: # pragma once Chris@101: #endif Chris@101: Chris@16: #include Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include //copy, copy_backward Chris@16: #include //uninitialized_copy Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // move Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #if !defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE) Chris@16: Chris@16: //! Effects: Moves elements in the range [first,last) into the range [result,result + (last - Chris@16: //! first)) starting from first and proceeding to last. For each non-negative integer n < (last-first), Chris@16: //! performs *(result + n) = ::boost::move (*(first + n)). Chris@16: //! Chris@16: //! Effects: result + (last - first). Chris@16: //! Chris@16: //! Requires: result shall not be in the range [first,last). Chris@16: //! Chris@16: //! Complexity: Exactly last - first move assignments. Chris@16: template // O models OutputIterator Chris@16: O move(I f, I l, O result) Chris@16: { Chris@16: while (f != l) { Chris@16: *result = ::boost::move(*f); Chris@16: ++f; ++result; Chris@16: } Chris@16: return result; Chris@16: } Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // move_backward Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: //! Effects: Moves elements in the range [first,last) into the range Chris@16: //! [result - (last-first),result) starting from last - 1 and proceeding to Chris@16: //! first. For each positive integer n <= (last - first), Chris@16: //! performs *(result - n) = ::boost::move(*(last - n)). Chris@16: //! Chris@16: //! Requires: result shall not be in the range [first,last). Chris@16: //! Chris@16: //! Returns: result - (last - first). Chris@16: //! Chris@16: //! Complexity: Exactly last - first assignments. Chris@16: template // O models BidirectionalIterator Chris@16: O move_backward(I f, I l, O result) Chris@16: { Chris@16: while (f != l) { Chris@16: --l; --result; Chris@16: *result = ::boost::move(*l); Chris@16: } Chris@16: return result; Chris@16: } Chris@16: Chris@16: #else Chris@16: Chris@16: using ::std::move_backward; Chris@16: Chris@16: #endif //!defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE) Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // uninitialized_move Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: //! Effects: Chris@16: //! \code Chris@16: //! for (; first != last; ++result, ++first) Chris@16: //! new (static_cast(&*result)) Chris@16: //! typename iterator_traits::value_type(boost::move(*first)); Chris@16: //! \endcode Chris@16: //! Chris@16: //! Returns: result Chris@16: template Chris@16: // F models ForwardIterator Chris@16: F uninitialized_move(I f, I l, F r Chris@16: /// @cond Chris@16: // ,typename ::boost::move_detail::enable_if::value_type> >::type* = 0 Chris@16: /// @endcond Chris@16: ) Chris@16: { Chris@16: typedef typename std::iterator_traits::value_type input_value_type; Chris@16: Chris@16: F back = r; Chris@16: BOOST_TRY{ Chris@16: while (f != l) { Chris@16: void * const addr = static_cast(::boost::move_detail::addressof(*r)); Chris@16: ::new(addr) input_value_type(::boost::move(*f)); Chris@16: ++f; ++r; Chris@16: } Chris@16: } Chris@16: BOOST_CATCH(...){ Chris@16: for (; back != r; ++back){ Chris@16: back->~input_value_type(); Chris@16: } Chris@16: BOOST_RETHROW; Chris@16: } Chris@16: BOOST_CATCH_END Chris@16: return r; Chris@16: } Chris@16: Chris@16: /// @cond Chris@16: /* Chris@16: template Chris@16: // F models ForwardIterator Chris@16: F uninitialized_move(I f, I l, F r, Chris@16: typename ::boost::move_detail::disable_if::value_type> >::type* = 0) Chris@16: { Chris@16: return std::uninitialized_copy(f, l, r); Chris@16: } Chris@16: */ Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // uninitialized_copy_or_move Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: namespace move_detail { Chris@16: Chris@16: template Chris@16: // F models ForwardIterator Chris@16: inline F uninitialized_move_move_iterator(I f, I l, F r Chris@16: // ,typename ::boost::move_detail::enable_if< has_move_emulation_enabled >::type* = 0 Chris@16: ) Chris@16: { Chris@16: return ::boost::uninitialized_move(f, l, r); Chris@16: } Chris@16: /* Chris@16: template Chris@16: // F models ForwardIterator Chris@16: F uninitialized_move_move_iterator(I f, I l, F r, Chris@16: typename ::boost::move_detail::disable_if< has_move_emulation_enabled >::type* = 0) Chris@16: { Chris@16: return std::uninitialized_copy(f.base(), l.base(), r); Chris@16: } Chris@16: */ Chris@16: } //namespace move_detail { Chris@16: Chris@16: template Chris@16: // F models ForwardIterator Chris@16: inline F uninitialized_copy_or_move(I f, I l, F r, Chris@16: typename ::boost::move_detail::enable_if< move_detail::is_move_iterator >::type* = 0) Chris@16: { Chris@16: return ::boost::move_detail::uninitialized_move_move_iterator(f, l, r); Chris@16: } Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // copy_or_move Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: namespace move_detail { Chris@16: Chris@16: template Chris@16: // F models ForwardIterator Chris@16: inline F move_move_iterator(I f, I l, F r Chris@16: // ,typename ::boost::move_detail::enable_if< has_move_emulation_enabled >::type* = 0 Chris@16: ) Chris@16: { Chris@16: return ::boost::move(f, l, r); Chris@16: } Chris@16: /* Chris@16: template Chris@16: // F models ForwardIterator Chris@16: F move_move_iterator(I f, I l, F r, Chris@16: typename ::boost::move_detail::disable_if< has_move_emulation_enabled >::type* = 0) Chris@16: { Chris@16: return std::copy(f.base(), l.base(), r); Chris@16: } Chris@16: */ Chris@16: Chris@16: } //namespace move_detail { Chris@16: Chris@16: template Chris@16: // F models ForwardIterator Chris@16: inline F copy_or_move(I f, I l, F r, Chris@16: typename ::boost::move_detail::enable_if< move_detail::is_move_iterator >::type* = 0) Chris@16: { Chris@16: return ::boost::move_detail::move_move_iterator(f, l, r); Chris@16: } Chris@16: Chris@16: /// @endcond Chris@16: Chris@16: //! Effects: Chris@16: //! \code Chris@16: //! for (; first != last; ++result, ++first) Chris@16: //! new (static_cast(&*result)) Chris@16: //! typename iterator_traits::value_type(*first); Chris@16: //! \endcode Chris@16: //! Chris@16: //! Returns: result Chris@16: //! Chris@16: //! Note: This function is provided because Chris@16: //! std::uninitialized_copy from some STL implementations Chris@16: //! is not compatible with move_iterator Chris@16: template Chris@16: // F models ForwardIterator Chris@16: inline F uninitialized_copy_or_move(I f, I l, F r Chris@16: /// @cond Chris@16: ,typename ::boost::move_detail::disable_if< move_detail::is_move_iterator >::type* = 0 Chris@16: /// @endcond Chris@16: ) Chris@16: { Chris@16: return std::uninitialized_copy(f, l, r); Chris@16: } Chris@16: Chris@16: //! Effects: Chris@16: //! \code Chris@16: //! for (; first != last; ++result, ++first) Chris@16: //! *result = *first; Chris@16: //! \endcode Chris@16: //! Chris@16: //! Returns: result Chris@16: //! Chris@16: //! Note: This function is provided because Chris@16: //! std::uninitialized_copy from some STL implementations Chris@16: //! is not compatible with move_iterator Chris@16: template Chris@16: // F models ForwardIterator Chris@16: inline F copy_or_move(I f, I l, F r Chris@16: /// @cond Chris@16: ,typename ::boost::move_detail::disable_if< move_detail::is_move_iterator >::type* = 0 Chris@16: /// @endcond Chris@16: ) Chris@16: { Chris@16: return std::copy(f, l, r); Chris@16: } Chris@16: Chris@16: } //namespace boost { Chris@16: Chris@16: #include Chris@16: Chris@101: #endif //#ifndef BOOST_MOVE_ALGORITHM_HPP