503 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			503 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
// (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 implements macros to define movable classes and
 | 
						|
//! move-aware functions
 | 
						|
 | 
						|
#ifndef BOOST_MOVE_CORE_HPP
 | 
						|
#define BOOST_MOVE_CORE_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>
 | 
						|
 | 
						|
// @cond
 | 
						|
 | 
						|
//boost_move_no_copy_constructor_or_assign typedef
 | 
						|
//used to detect noncopyable types for other Boost libraries.
 | 
						|
#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
						|
   #define BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE) \
 | 
						|
      private:\
 | 
						|
      TYPE(TYPE &);\
 | 
						|
      TYPE& operator=(TYPE &);\
 | 
						|
      public:\
 | 
						|
      typedef int boost_move_no_copy_constructor_or_assign; \
 | 
						|
      private:\
 | 
						|
   //
 | 
						|
#else
 | 
						|
   #define BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE) \
 | 
						|
      public:\
 | 
						|
      TYPE(TYPE const &) = delete;\
 | 
						|
      TYPE& operator=(TYPE const &) = delete;\
 | 
						|
      public:\
 | 
						|
      typedef int boost_move_no_copy_constructor_or_assign; \
 | 
						|
      private:\
 | 
						|
   //
 | 
						|
#endif   //BOOST_NO_CXX11_DELETED_FUNCTIONS
 | 
						|
 | 
						|
// @endcond
 | 
						|
 | 
						|
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
 | 
						|
   #include <boost/move/detail/type_traits.hpp>
 | 
						|
 | 
						|
   #if defined(BOOST_MOVE_ADDRESS_SANITIZER_ON)
 | 
						|
      #define BOOST_MOVE_TO_RV_CAST(RV_TYPE, ARG) reinterpret_cast<RV_TYPE>(ARG)
 | 
						|
   #else
 | 
						|
      #define BOOST_MOVE_TO_RV_CAST(RV_TYPE, ARG) static_cast<RV_TYPE>(ARG)
 | 
						|
   #endif
 | 
						|
 | 
						|
   //Move emulation rv breaks standard aliasing rules so add workarounds for some compilers
 | 
						|
   #if defined(__GNUC__) && (__GNUC__ >= 4) && \
 | 
						|
      (\
 | 
						|
         defined(BOOST_GCC) ||   \
 | 
						|
         (defined(BOOST_INTEL) && (BOOST_INTEL_CXX_VERSION >= 1300)) \
 | 
						|
      )
 | 
						|
      #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS __attribute__((__may_alias__))
 | 
						|
   #else
 | 
						|
      #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS
 | 
						|
   #endif
 | 
						|
 | 
						|
   namespace boost {
 | 
						|
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   //
 | 
						|
   //                            struct rv
 | 
						|
   //
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   template <class T>
 | 
						|
   class rv
 | 
						|
      : public ::boost::move_detail::if_c
 | 
						|
         < ::boost::move_detail::is_class<T>::value
 | 
						|
         , T
 | 
						|
         , ::boost::move_detail::nat
 | 
						|
         >::type
 | 
						|
   {
 | 
						|
      rv();
 | 
						|
      ~rv() throw();
 | 
						|
      rv(rv const&);
 | 
						|
      void operator=(rv const&);
 | 
						|
   } BOOST_MOVE_ATTRIBUTE_MAY_ALIAS;
 | 
						|
 | 
						|
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   //
 | 
						|
   //                            is_rv
 | 
						|
   //
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
   namespace move_detail {
 | 
						|
 | 
						|
   template <class T>
 | 
						|
   struct is_rv
 | 
						|
        //Derive from integral constant because some Boost code assummes it has
 | 
						|
        //a "type" internal typedef
 | 
						|
      : integral_constant<bool, ::boost::move_detail::is_rv_impl<T>::value >
 | 
						|
   {};
 | 
						|
 | 
						|
   template <class T>
 | 
						|
   struct is_not_rv
 | 
						|
   {
 | 
						|
      static const bool value = !is_rv<T>::value;
 | 
						|
   };
 | 
						|
 | 
						|
   }  //namespace move_detail {
 | 
						|
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   //
 | 
						|
   //                               has_move_emulation_enabled
 | 
						|
   //
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   template<class T>
 | 
						|
   struct has_move_emulation_enabled
 | 
						|
      : ::boost::move_detail::has_move_emulation_enabled_impl<T>
 | 
						|
   {};
 | 
						|
 | 
						|
   template<class T>
 | 
						|
   struct has_move_emulation_disabled
 | 
						|
   {
 | 
						|
      static const bool value = !::boost::move_detail::has_move_emulation_enabled_impl<T>::value;
 | 
						|
   };
 | 
						|
 | 
						|
   }  //namespace boost {
 | 
						|
 | 
						|
   #define BOOST_RV_REF(TYPE)\
 | 
						|
      ::boost::rv< TYPE >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
 | 
						|
      ::boost::rv< TYPE<ARG1, ARG2> >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
 | 
						|
      ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_RV_REF_BEG\
 | 
						|
      ::boost::rv<   \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_RV_REF_END\
 | 
						|
      >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_RV_REF_BEG_IF_CXX11 \
 | 
						|
      \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_RV_REF_END_IF_CXX11 \
 | 
						|
      \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_FWD_REF(TYPE)\
 | 
						|
      const TYPE & \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF(TYPE)\
 | 
						|
      const ::boost::rv< TYPE >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_BEG \
 | 
						|
      const ::boost::rv<  \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_END \
 | 
						|
      >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
 | 
						|
      const ::boost::rv< TYPE<ARG1, ARG2> >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
 | 
						|
      const ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
 | 
						|
      const ::boost::rv< TYPE >& \
 | 
						|
   //
 | 
						|
 | 
						|
   namespace boost {
 | 
						|
   namespace move_detail {
 | 
						|
 | 
						|
   template <class Ret, class T>
 | 
						|
   BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c
 | 
						|
      <  ::boost::move_detail::is_lvalue_reference<Ret>::value ||
 | 
						|
        !::boost::has_move_emulation_enabled<T>::value
 | 
						|
      , T&>::type
 | 
						|
         move_return(T& x) BOOST_NOEXCEPT
 | 
						|
   {
 | 
						|
      return x;
 | 
						|
   }
 | 
						|
 | 
						|
   template <class Ret, class T>
 | 
						|
   BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c
 | 
						|
      < !::boost::move_detail::is_lvalue_reference<Ret>::value &&
 | 
						|
         ::boost::has_move_emulation_enabled<T>::value
 | 
						|
      , ::boost::rv<T>&>::type
 | 
						|
         move_return(T& x) BOOST_NOEXCEPT
 | 
						|
   {
 | 
						|
      return *BOOST_MOVE_TO_RV_CAST(::boost::rv<T>*, ::boost::move_detail::addressof(x));
 | 
						|
   }
 | 
						|
 | 
						|
   template <class Ret, class T>
 | 
						|
   BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c
 | 
						|
      < !::boost::move_detail::is_lvalue_reference<Ret>::value &&
 | 
						|
         ::boost::has_move_emulation_enabled<T>::value
 | 
						|
      , ::boost::rv<T>&>::type
 | 
						|
         move_return(::boost::rv<T>& x) BOOST_NOEXCEPT
 | 
						|
   {
 | 
						|
      return x;
 | 
						|
   }
 | 
						|
 | 
						|
   }  //namespace move_detail {
 | 
						|
   }  //namespace boost {
 | 
						|
 | 
						|
   #define BOOST_MOVE_RET(RET_TYPE, REF)\
 | 
						|
      boost::move_detail::move_return< RET_TYPE >(REF)
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_MOVE_BASE(BASE_TYPE, ARG) \
 | 
						|
      ::boost::move((BASE_TYPE&)(ARG))
 | 
						|
   //
 | 
						|
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   //
 | 
						|
   //                         BOOST_MOVABLE_BUT_NOT_COPYABLE
 | 
						|
   //
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
 | 
						|
      BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE)\
 | 
						|
      public:\
 | 
						|
      BOOST_MOVE_FORCEINLINE operator ::boost::rv<TYPE>&() \
 | 
						|
      {  return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this);  }\
 | 
						|
      BOOST_MOVE_FORCEINLINE operator const ::boost::rv<TYPE>&() const \
 | 
						|
      {  return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this);  }\
 | 
						|
      private:\
 | 
						|
   //
 | 
						|
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
   //
 | 
						|
   //                         BOOST_COPYABLE_AND_MOVABLE
 | 
						|
   //
 | 
						|
   //////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
   #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
 | 
						|
      public:\
 | 
						|
      BOOST_MOVE_FORCEINLINE TYPE& operator=(TYPE &t)\
 | 
						|
      {  this->operator=(const_cast<const TYPE&>(t)); return *this;}\
 | 
						|
      public:\
 | 
						|
      BOOST_MOVE_FORCEINLINE operator ::boost::rv<TYPE>&() \
 | 
						|
      {  return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this);  }\
 | 
						|
      BOOST_MOVE_FORCEINLINE operator const ::boost::rv<TYPE>&() const \
 | 
						|
      {  return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this);  }\
 | 
						|
      private:\
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
 | 
						|
      public:\
 | 
						|
      BOOST_MOVE_FORCEINLINE operator ::boost::rv<TYPE>&() \
 | 
						|
      {  return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this);  }\
 | 
						|
      BOOST_MOVE_FORCEINLINE operator const ::boost::rv<TYPE>&() const \
 | 
						|
      {  return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this);  }\
 | 
						|
      private:\
 | 
						|
   //
 | 
						|
 | 
						|
   namespace boost{
 | 
						|
   namespace move_detail{
 | 
						|
 | 
						|
   template< class T>
 | 
						|
   struct forward_type
 | 
						|
   { typedef const T &type; };
 | 
						|
 | 
						|
   template< class T>
 | 
						|
   struct forward_type< boost::rv<T> >
 | 
						|
   { typedef T type; };
 | 
						|
 | 
						|
   }}
 | 
						|
 | 
						|
#else    //BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
   //! This macro marks a type as movable but not copyable, disabling copy construction
 | 
						|
   //! and assignment. The user will need to write a move constructor/assignment as explained
 | 
						|
   //! in the documentation to fully write a movable but not copyable class.
 | 
						|
   #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
 | 
						|
      BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE)\
 | 
						|
      public:\
 | 
						|
      typedef int boost_move_emulation_t;\
 | 
						|
      private:\
 | 
						|
   //
 | 
						|
 | 
						|
   //! This macro marks a type as copyable and movable.
 | 
						|
   //! The user will need to write a move constructor/assignment and a copy assignment
 | 
						|
   //! as explained in the documentation to fully write a copyable and movable class.
 | 
						|
   #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
 | 
						|
   //
 | 
						|
 | 
						|
   #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
   #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
 | 
						|
   //
 | 
						|
   #endif   //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
 | 
						|
   namespace boost {
 | 
						|
 | 
						|
   //!This trait yields to a compile-time true boolean if T was marked as
 | 
						|
   //!BOOST_MOVABLE_BUT_NOT_COPYABLE or BOOST_COPYABLE_AND_MOVABLE and
 | 
						|
   //!rvalue references are not available on the platform. False otherwise.
 | 
						|
   template<class T>
 | 
						|
   struct has_move_emulation_enabled
 | 
						|
   {
 | 
						|
      static const bool value = false;
 | 
						|
   };
 | 
						|
 | 
						|
   template<class T>
 | 
						|
   struct has_move_emulation_disabled
 | 
						|
   {
 | 
						|
      static const bool value = true;
 | 
						|
   };
 | 
						|
 | 
						|
   }  //namespace boost{
 | 
						|
 | 
						|
   //!This macro is used to achieve portable syntax in move
 | 
						|
   //!constructors and assignments for classes marked as
 | 
						|
   //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE
 | 
						|
   #define BOOST_RV_REF(TYPE)\
 | 
						|
      TYPE && \
 | 
						|
   //
 | 
						|
 | 
						|
   //!This macro is used to achieve portable syntax in move
 | 
						|
   //!constructors and assignments for template classes marked as
 | 
						|
   //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE.
 | 
						|
   //!As macros have problems with comma-separated template arguments,
 | 
						|
   //!the template argument must be preceded with BOOST_RV_REF_BEG
 | 
						|
   //!and ended with BOOST_RV_REF_END
 | 
						|
   #define BOOST_RV_REF_BEG\
 | 
						|
         \
 | 
						|
   //
 | 
						|
 | 
						|
   //!This macro is used to achieve portable syntax in move
 | 
						|
   //!constructors and assignments for template classes marked as
 | 
						|
   //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE.
 | 
						|
   //!As macros have problems with comma-separated template arguments,
 | 
						|
   //!the template argument must be preceded with BOOST_RV_REF_BEG
 | 
						|
   //!and ended with BOOST_RV_REF_END
 | 
						|
   #define BOOST_RV_REF_END\
 | 
						|
      && \
 | 
						|
   //
 | 
						|
 | 
						|
   //!This macro expands to BOOST_RV_REF_BEG if BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
   //!is not defined, empty otherwise
 | 
						|
   #define BOOST_RV_REF_BEG_IF_CXX11 \
 | 
						|
      BOOST_RV_REF_BEG \
 | 
						|
   //
 | 
						|
 | 
						|
   //!This macro expands to BOOST_RV_REF_END if BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
   //!is not defined, empty otherwise
 | 
						|
   #define BOOST_RV_REF_END_IF_CXX11 \
 | 
						|
      BOOST_RV_REF_END \
 | 
						|
   //
 | 
						|
 | 
						|
   //!This macro is used to achieve portable syntax in copy
 | 
						|
   //!assignment for classes marked as BOOST_COPYABLE_AND_MOVABLE.
 | 
						|
   #define BOOST_COPY_ASSIGN_REF(TYPE)\
 | 
						|
      const TYPE & \
 | 
						|
   //
 | 
						|
 | 
						|
   //! This macro is used to implement portable perfect forwarding
 | 
						|
   //! as explained in the documentation.
 | 
						|
   #define BOOST_FWD_REF(TYPE)\
 | 
						|
      TYPE && \
 | 
						|
   //
 | 
						|
 | 
						|
   #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
 | 
						|
   #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
 | 
						|
      TYPE<ARG1, ARG2> && \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
 | 
						|
      TYPE<ARG1, ARG2, ARG3> && \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_BEG \
 | 
						|
      const \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_END \
 | 
						|
      & \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
 | 
						|
      const TYPE<ARG1, ARG2> & \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
 | 
						|
      const TYPE<ARG1, ARG2, ARG3>& \
 | 
						|
   //
 | 
						|
 | 
						|
   #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
 | 
						|
      const TYPE & \
 | 
						|
   //
 | 
						|
 | 
						|
   #endif   //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
 | 
						|
   #if !defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
 | 
						|
      //!This macro is used to achieve portable move return semantics.
 | 
						|
      //!The C++11 Standard allows implicit move returns when the object to be returned
 | 
						|
      //!is designated by a lvalue and:
 | 
						|
      //!   - The criteria for elision of a copy operation are met OR
 | 
						|
      //!   - The criteria would be met save for the fact that the source object is a function parameter
 | 
						|
      //!
 | 
						|
      //!For C++11 conforming compilers this macros only yields to REF:
 | 
						|
      //! <code>return BOOST_MOVE_RET(RET_TYPE, REF);</code> -> <code>return REF;</code>
 | 
						|
      //!
 | 
						|
      //!For compilers without rvalue references
 | 
						|
      //!this macro does an explicit move if the move emulation is activated
 | 
						|
      //!and the return type (RET_TYPE) is not a reference.
 | 
						|
      //!
 | 
						|
      //!For non-conforming compilers with rvalue references like Visual 2010 & 2012,
 | 
						|
      //!an explicit move is performed if RET_TYPE is not a reference.
 | 
						|
      //!
 | 
						|
      //! <b>Caution</b>: When using this macro in non-conforming or C++03
 | 
						|
      //!compilers, a move will be performed even if the C++11 standard does not allow it
 | 
						|
      //!(e.g. returning a static variable). The user is responsible for using this macro
 | 
						|
      //!only to return local objects that met C++11 criteria.
 | 
						|
      #define BOOST_MOVE_RET(RET_TYPE, REF)\
 | 
						|
         REF
 | 
						|
      //
 | 
						|
 | 
						|
   #else //!defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
 | 
						|
      #include <boost/move/detail/meta_utils.hpp>
 | 
						|
 | 
						|
      namespace boost {
 | 
						|
      namespace move_detail {
 | 
						|
 | 
						|
      template <class Ret, class T>
 | 
						|
      BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c
 | 
						|
         <  ::boost::move_detail::is_lvalue_reference<Ret>::value
 | 
						|
         , T&>::type
 | 
						|
            move_return(T& x) BOOST_NOEXCEPT
 | 
						|
      {
 | 
						|
         return x;
 | 
						|
      }
 | 
						|
 | 
						|
      template <class Ret, class T>
 | 
						|
      BOOST_MOVE_FORCEINLINE typename ::boost::move_detail::enable_if_c
 | 
						|
         < !::boost::move_detail::is_lvalue_reference<Ret>::value
 | 
						|
         , Ret && >::type
 | 
						|
            move_return(T&& t) BOOST_NOEXCEPT
 | 
						|
      {
 | 
						|
         return static_cast< Ret&& >(t);
 | 
						|
      }
 | 
						|
 | 
						|
      }  //namespace move_detail {
 | 
						|
      }  //namespace boost {
 | 
						|
 | 
						|
      #define BOOST_MOVE_RET(RET_TYPE, REF)\
 | 
						|
         boost::move_detail::move_return< RET_TYPE >(REF)
 | 
						|
      //
 | 
						|
 | 
						|
   #endif   //!defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
 | 
						|
 | 
						|
   //!This macro is used to achieve portable optimal move constructors.
 | 
						|
   //!
 | 
						|
   //!When implementing the move constructor, in C++03 compilers the moved-from argument must be
 | 
						|
   //!cast to the base type before calling `::boost::move()` due to rvalue reference limitations.
 | 
						|
   //!
 | 
						|
   //!In C++11 compilers the cast from a rvalue reference of a derived type to a rvalue reference of
 | 
						|
   //!a base type is implicit.
 | 
						|
   #define BOOST_MOVE_BASE(BASE_TYPE, ARG) \
 | 
						|
      ::boost::move((BASE_TYPE&)(ARG))
 | 
						|
   //
 | 
						|
 | 
						|
   namespace boost {
 | 
						|
   namespace move_detail {
 | 
						|
 | 
						|
   template< class T> struct forward_type { typedef T type; };
 | 
						|
 | 
						|
   }}
 | 
						|
 | 
						|
#endif   //BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
#include <boost/move/detail/config_end.hpp>
 | 
						|
 | 
						|
#endif //#ifndef BOOST_MOVE_CORE_HPP
 |