151 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			151 lines
		
	
	
		
			5.3 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
 | ||
|  | //! This header includes core utilities from <tt><boost/move/utility_core.hpp></tt> and defines
 | ||
|  | //! some more advanced utilities such as:
 | ||
|  | 
 | ||
|  | #ifndef BOOST_MOVE_MOVE_UTILITY_HPP
 | ||
|  | #define BOOST_MOVE_MOVE_UTILITY_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/detail/workaround.hpp>  //forceinline
 | ||
|  | #include <boost/move/utility_core.hpp>
 | ||
|  | #include <boost/move/traits.hpp>
 | ||
|  | 
 | ||
|  | #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | ||
|  | 
 | ||
|  |    namespace boost { | ||
|  | 
 | ||
|  |    //////////////////////////////////////////////////////////////////////////////
 | ||
|  |    //
 | ||
|  |    //                            move_if_noexcept()
 | ||
|  |    //
 | ||
|  |    //////////////////////////////////////////////////////////////////////////////
 | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c | ||
|  |       < enable_move_utility_emulation<T>::value && !has_move_emulation_enabled<T>::value | ||
|  |       , typename ::boost::move_detail::add_const<T>::type & | ||
|  |       >::type | ||
|  |          move_if_noexcept(T& x) BOOST_NOEXCEPT | ||
|  |    { | ||
|  |       return x; | ||
|  |    } | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c | ||
|  |       < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value | ||
|  |             && ::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value, rv<T>&>::type | ||
|  |          move_if_noexcept(T& x) BOOST_NOEXCEPT | ||
|  |    { | ||
|  |       return *static_cast<rv<T>* >(::boost::move_detail::addressof(x)); | ||
|  |    } | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c | ||
|  |       < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value | ||
|  |             && ::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value | ||
|  |       , rv<T>& | ||
|  |       >::type | ||
|  |          move_if_noexcept(rv<T>& x) BOOST_NOEXCEPT | ||
|  |    { | ||
|  |       return x; | ||
|  |    } | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c | ||
|  |       < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value | ||
|  |             && !::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value | ||
|  |       , typename ::boost::move_detail::add_const<T>::type & | ||
|  |       >::type | ||
|  |          move_if_noexcept(T& x) BOOST_NOEXCEPT | ||
|  |    { | ||
|  |       return x; | ||
|  |    } | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c | ||
|  |       < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value | ||
|  |             && !::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value | ||
|  |       , typename ::boost::move_detail::add_const<T>::type & | ||
|  |       >::type | ||
|  |          move_if_noexcept(rv<T>& x) BOOST_NOEXCEPT | ||
|  |    { | ||
|  |       return x; | ||
|  |    } | ||
|  | 
 | ||
|  |    }  //namespace boost
 | ||
|  | 
 | ||
|  | #else    //#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | ||
|  | 
 | ||
|  |    #if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
 | ||
|  |       #include <utility>
 | ||
|  | 
 | ||
|  |       namespace boost{ | ||
|  | 
 | ||
|  |       using ::std::move_if_noexcept; | ||
|  | 
 | ||
|  |       }  //namespace boost
 | ||
|  | 
 | ||
|  |    #else //!BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE
 | ||
|  | 
 | ||
|  |       namespace boost { | ||
|  | 
 | ||
|  |       //////////////////////////////////////////////////////////////////////////////
 | ||
|  |       //
 | ||
|  |       //                            move_if_noexcept()
 | ||
|  |       //
 | ||
|  |       //////////////////////////////////////////////////////////////////////////////
 | ||
|  |       #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | ||
|  |          //! This function provides a way to convert a reference into a rvalue reference
 | ||
|  |          //! in compilers with rvalue references. For other compilers converts T & into
 | ||
|  |          //! <i>::boost::rv<T> &</i> so that move emulation is activated. Reference
 | ||
|  |          //! would be converted to rvalue reference only if input type is nothrow move
 | ||
|  |          //! constructible or if it has no copy constructor. In all other cases const
 | ||
|  |          //! reference would be returned
 | ||
|  |          template <class T> | ||
|  |          rvalue_reference_or_const_lvalue_reference move_if_noexcept(input_reference) noexcept; | ||
|  | 
 | ||
|  |       #else //BOOST_MOVE_DOXYGEN_INVOKED
 | ||
|  | 
 | ||
|  |          template <class T> | ||
|  |          BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c | ||
|  |             < ::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value, T&&>::type | ||
|  |                move_if_noexcept(T& x) BOOST_NOEXCEPT | ||
|  |          {  return ::boost::move(x);   } | ||
|  | 
 | ||
|  |          template <class T> | ||
|  |          BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c | ||
|  |             < !::boost::move_detail::is_nothrow_move_constructible_or_uncopyable<T>::value, const T&>::type | ||
|  |                move_if_noexcept(T& x) BOOST_NOEXCEPT | ||
|  |          {  return x;  } | ||
|  | 
 | ||
|  |       #endif //BOOST_MOVE_DOXYGEN_INVOKED
 | ||
|  | 
 | ||
|  |       }  //namespace boost {
 | ||
|  | 
 | ||
|  |    #endif   //#if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
 | ||
|  | 
 | ||
|  | #endif   //BOOST_NO_CXX11_RVALUE_REFERENCES
 | ||
|  | 
 | ||
|  | #include <boost/move/detail/config_end.hpp>
 | ||
|  | 
 | ||
|  | #endif //#ifndef BOOST_MOVE_MOVE_UTILITY_HPP
 |