156 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			156 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | ////////////////////////////////////////////////////////////////////////////// | ||
|  | // | ||
|  | // (C) Copyright Ion Gaztanaga 2012-2016. | ||
|  | // 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) | ||
|  | // | ||
|  | // See http://www.boost.org/libs/move for documentation. | ||
|  | // | ||
|  | ////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  | //! \file | ||
|  | 
 | ||
|  | #ifndef BOOST_MOVE_ALGO_MOVE_HPP | ||
|  | #define BOOST_MOVE_ALGO_MOVE_HPP | ||
|  | 
 | ||
|  | #ifndef BOOST_CONFIG_HPP | ||
|  | #  include <boost/config.hpp> | ||
|  | #endif | ||
|  | # | ||
|  | #if defined(BOOST_HAS_PRAGMA_ONCE) | ||
|  | #  pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/move/detail/config_begin.hpp> | ||
|  | 
 | ||
|  | #include <boost/move/utility_core.hpp> | ||
|  | #include <boost/move/detail/iterator_traits.hpp> | ||
|  | #include <boost/detail/no_exceptions_support.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | 
 | ||
|  | ////////////////////////////////////////////////////////////////////////////// | ||
|  | // | ||
|  | //                               move | ||
|  | // | ||
|  | ////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  | #if !defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE) | ||
|  | 
 | ||
|  |    //! <b>Effects</b>: Moves elements in the range [first,last) into the range [result,result + (last - | ||
|  |    //!   first)) starting from first and proceeding to last. For each non-negative integer n < (last-first), | ||
|  |    //!   performs *(result + n) = ::boost::move (*(first + n)). | ||
|  |    //! | ||
|  |    //! <b>Effects</b>: result + (last - first). | ||
|  |    //! | ||
|  |    //! <b>Requires</b>: result shall not be in the range [first,last). | ||
|  |    //! | ||
|  |    //! <b>Complexity</b>: Exactly last - first move assignments. | ||
|  |    template <typename I, // I models InputIterator | ||
|  |             typename O> // O models OutputIterator | ||
|  |    O move(I f, I l, O result) | ||
|  |    { | ||
|  |       while (f != l) { | ||
|  |          *result = ::boost::move(*f); | ||
|  |          ++f; ++result; | ||
|  |       } | ||
|  |       return result; | ||
|  |    } | ||
|  | 
 | ||
|  |    ////////////////////////////////////////////////////////////////////////////// | ||
|  |    // | ||
|  |    //                               move_backward | ||
|  |    // | ||
|  |    ////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  |    //! <b>Effects</b>: Moves elements in the range [first,last) into the range | ||
|  |    //!   [result - (last-first),result) starting from last - 1 and proceeding to | ||
|  |    //!   first. For each positive integer n <= (last - first), | ||
|  |    //!   performs *(result - n) = ::boost::move(*(last - n)). | ||
|  |    //! | ||
|  |    //! <b>Requires</b>: result shall not be in the range [first,last). | ||
|  |    //! | ||
|  |    //! <b>Returns</b>: result - (last - first). | ||
|  |    //! | ||
|  |    //! <b>Complexity</b>: Exactly last - first assignments. | ||
|  |    template <typename I, // I models BidirectionalIterator | ||
|  |    typename O> // O models BidirectionalIterator | ||
|  |    O move_backward(I f, I l, O result) | ||
|  |    { | ||
|  |       while (f != l) { | ||
|  |          --l; --result; | ||
|  |          *result = ::boost::move(*l); | ||
|  |       } | ||
|  |       return result; | ||
|  |    } | ||
|  | 
 | ||
|  | #else | ||
|  | 
 | ||
|  |    using ::std::move_backward; | ||
|  | 
 | ||
|  | #endif   //!defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE) | ||
|  | 
 | ||
|  | ////////////////////////////////////////////////////////////////////////////// | ||
|  | // | ||
|  | //                               uninitialized_move | ||
|  | // | ||
|  | ////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  | //! <b>Effects</b>: | ||
|  | //!   \code | ||
|  | //!   for (; first != last; ++result, ++first) | ||
|  | //!      new (static_cast<void*>(&*result)) | ||
|  | //!         typename iterator_traits<ForwardIterator>::value_type(boost::move(*first)); | ||
|  | //!   \endcode | ||
|  | //! | ||
|  | //! <b>Returns</b>: result | ||
|  | template | ||
|  |    <typename I, // I models InputIterator | ||
|  |     typename F> // F models ForwardIterator | ||
|  | F uninitialized_move(I f, I l, F r | ||
|  |    /// @cond | ||
|  | //   ,typename ::boost::move_detail::enable_if<has_move_emulation_enabled<typename boost::movelib::iterator_traits<I>::value_type> >::type* = 0 | ||
|  |    /// @endcond | ||
|  |    ) | ||
|  | { | ||
|  |    typedef typename boost::movelib::iterator_traits<I>::value_type input_value_type; | ||
|  | 
 | ||
|  |    F back = r; | ||
|  |    BOOST_TRY{ | ||
|  |       while (f != l) { | ||
|  |          void * const addr = static_cast<void*>(::boost::move_detail::addressof(*r)); | ||
|  |          ::new(addr) input_value_type(::boost::move(*f)); | ||
|  |          ++f; ++r; | ||
|  |       } | ||
|  |    } | ||
|  |    BOOST_CATCH(...){ | ||
|  |       for (; back != r; ++back){ | ||
|  |          back->~input_value_type(); | ||
|  |       } | ||
|  |       BOOST_RETHROW; | ||
|  |    } | ||
|  |    BOOST_CATCH_END | ||
|  |    return r; | ||
|  | } | ||
|  | 
 | ||
|  | /// @cond | ||
|  | /* | ||
|  | template | ||
|  |    <typename I,   // I models InputIterator | ||
|  |     typename F>   // F models ForwardIterator | ||
|  | F uninitialized_move(I f, I l, F r, | ||
|  |    typename ::boost::move_detail::disable_if<has_move_emulation_enabled<typename boost::movelib::iterator_traits<I>::value_type> >::type* = 0) | ||
|  | { | ||
|  |    return std::uninitialized_copy(f, l, r); | ||
|  | } | ||
|  | */ | ||
|  | 
 | ||
|  | /// @endcond | ||
|  | 
 | ||
|  | }  //namespace boost { | ||
|  | 
 | ||
|  | #include <boost/move/detail/config_end.hpp> | ||
|  | 
 | ||
|  | #endif //#ifndef BOOST_MOVE_ALGO_MOVE_HPP |