You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-11-03 17:13:17 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			275 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			275 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
// (C) Copyright Ion Gaztanaga 2012-2012.
 | 
						|
// 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_ALGORITHM_HPP
 | 
						|
#define BOOST_MOVE_ALGORITHM_HPP
 | 
						|
 | 
						|
#include <boost/move/detail/config_begin.hpp>
 | 
						|
 | 
						|
#include <boost/move/utility.hpp>
 | 
						|
#include <boost/move/iterator.hpp>
 | 
						|
#include <boost/detail/no_exceptions_support.hpp>
 | 
						|
 | 
						|
#include <algorithm> //copy, copy_backward
 | 
						|
#include <memory>    //uninitialized_copy
 | 
						|
 | 
						|
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 std::iterator_traits<I>::value_type> >::type* = 0
 | 
						|
   /// @endcond
 | 
						|
   )
 | 
						|
{
 | 
						|
   typedef typename std::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 std::iterator_traits<I>::value_type> >::type* = 0)
 | 
						|
{
 | 
						|
   return std::uninitialized_copy(f, l, r);
 | 
						|
}
 | 
						|
*/
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//                            uninitialized_copy_or_move
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
namespace move_detail {
 | 
						|
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
inline F uninitialized_move_move_iterator(I f, I l, F r
 | 
						|
//                             ,typename ::boost::move_detail::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
 | 
						|
)
 | 
						|
{
 | 
						|
   return ::boost::uninitialized_move(f, l, r);
 | 
						|
}
 | 
						|
/*
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
F uninitialized_move_move_iterator(I f, I l, F r,
 | 
						|
                                   typename ::boost::move_detail::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
 | 
						|
{
 | 
						|
   return std::uninitialized_copy(f.base(), l.base(), r);
 | 
						|
}
 | 
						|
*/
 | 
						|
}  //namespace move_detail {
 | 
						|
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
inline F uninitialized_copy_or_move(I f, I l, F r,
 | 
						|
                             typename ::boost::move_detail::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
 | 
						|
{
 | 
						|
   return ::boost::move_detail::uninitialized_move_move_iterator(f, l, r);
 | 
						|
}
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//                            copy_or_move
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
namespace move_detail {
 | 
						|
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
inline F move_move_iterator(I f, I l, F r
 | 
						|
//                             ,typename ::boost::move_detail::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
 | 
						|
)
 | 
						|
{
 | 
						|
   return ::boost::move(f, l, r);
 | 
						|
}
 | 
						|
/*
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
F move_move_iterator(I f, I l, F r,
 | 
						|
                                   typename ::boost::move_detail::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
 | 
						|
{
 | 
						|
   return std::copy(f.base(), l.base(), r);
 | 
						|
}
 | 
						|
*/
 | 
						|
 | 
						|
}  //namespace move_detail {
 | 
						|
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
inline F copy_or_move(I f, I l, F r,
 | 
						|
                             typename ::boost::move_detail::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
 | 
						|
{
 | 
						|
   return ::boost::move_detail::move_move_iterator(f, l, r);
 | 
						|
}
 | 
						|
 | 
						|
/// @endcond
 | 
						|
 | 
						|
//! <b>Effects</b>:
 | 
						|
//!   \code
 | 
						|
//!   for (; first != last; ++result, ++first)
 | 
						|
//!      new (static_cast<void*>(&*result))
 | 
						|
//!         typename iterator_traits<ForwardIterator>::value_type(*first);
 | 
						|
//!   \endcode
 | 
						|
//!
 | 
						|
//! <b>Returns</b>: result
 | 
						|
//!
 | 
						|
//! <b>Note</b>: This function is provided because
 | 
						|
//!   <i>std::uninitialized_copy</i> from some STL implementations
 | 
						|
//!    is not compatible with <i>move_iterator</i>
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
inline F uninitialized_copy_or_move(I f, I l, F r
 | 
						|
   /// @cond
 | 
						|
   ,typename ::boost::move_detail::disable_if< move_detail::is_move_iterator<I> >::type* = 0
 | 
						|
   /// @endcond
 | 
						|
   )
 | 
						|
{
 | 
						|
   return std::uninitialized_copy(f, l, r);
 | 
						|
}
 | 
						|
 | 
						|
//! <b>Effects</b>:
 | 
						|
//!   \code
 | 
						|
//!   for (; first != last; ++result, ++first)
 | 
						|
//!      *result = *first;
 | 
						|
//!   \endcode
 | 
						|
//!
 | 
						|
//! <b>Returns</b>: result
 | 
						|
//!
 | 
						|
//! <b>Note</b>: This function is provided because
 | 
						|
//!   <i>std::uninitialized_copy</i> from some STL implementations
 | 
						|
//!    is not compatible with <i>move_iterator</i>
 | 
						|
template
 | 
						|
<typename I,   // I models InputIterator
 | 
						|
typename F>   // F models ForwardIterator
 | 
						|
inline F copy_or_move(I f, I l, F r
 | 
						|
   /// @cond
 | 
						|
   ,typename ::boost::move_detail::disable_if< move_detail::is_move_iterator<I> >::type* = 0
 | 
						|
   /// @endcond
 | 
						|
   )
 | 
						|
{
 | 
						|
   return std::copy(f, l, r);
 | 
						|
}
 | 
						|
 | 
						|
}  //namespace boost {
 | 
						|
 | 
						|
#include <boost/move/detail/config_end.hpp>
 | 
						|
 | 
						|
#endif //#ifndef BOOST_MOVE_MOVE_HPP
 |