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
							 |