586 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			586 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
// (C) Copyright Ion Gaztanaga 2012-2015.
 | 
						|
// 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_DETAIL_META_UTILS_HPP
 | 
						|
#define BOOST_MOVE_DETAIL_META_UTILS_HPP
 | 
						|
 | 
						|
#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/detail/meta_utils_core.hpp>
 | 
						|
#include <cstddef>   //for std::size_t
 | 
						|
 | 
						|
//Small meta-typetraits to support move
 | 
						|
 | 
						|
namespace boost {
 | 
						|
 | 
						|
//Forward declare boost::rv
 | 
						|
template <class T> class rv;
 | 
						|
 | 
						|
namespace move_detail {
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//          is_different
 | 
						|
//////////////////////////////////////
 | 
						|
template<class T, class U>
 | 
						|
struct is_different
 | 
						|
{
 | 
						|
   static const bool value = !is_same<T, U>::value;
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             apply
 | 
						|
//////////////////////////////////////
 | 
						|
template<class F, class Param>
 | 
						|
struct apply
 | 
						|
{
 | 
						|
   typedef typename F::template apply<Param>::type type;
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             bool_
 | 
						|
//////////////////////////////////////
 | 
						|
 | 
						|
template< bool C_ >
 | 
						|
struct bool_ : integral_constant<bool, C_>
 | 
						|
{
 | 
						|
     operator bool() const { return C_; }
 | 
						|
   bool operator()() const { return C_; }
 | 
						|
};
 | 
						|
 | 
						|
typedef bool_<true>        true_;
 | 
						|
typedef bool_<false>       false_;
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//              nat
 | 
						|
//////////////////////////////////////
 | 
						|
struct nat{};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//          yes_type/no_type
 | 
						|
//////////////////////////////////////
 | 
						|
typedef char yes_type;
 | 
						|
 | 
						|
struct no_type
 | 
						|
{
 | 
						|
   char _[2];
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//            natify
 | 
						|
//////////////////////////////////////
 | 
						|
template <class T> struct natify{};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//          remove_reference
 | 
						|
//////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct remove_reference
 | 
						|
{
 | 
						|
   typedef T type;
 | 
						|
};
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct remove_reference<T&>
 | 
						|
{
 | 
						|
   typedef T type;
 | 
						|
};
 | 
						|
 | 
						|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct remove_reference<T&&>
 | 
						|
{
 | 
						|
   typedef T type;
 | 
						|
};
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct remove_reference< rv<T> >
 | 
						|
{
 | 
						|
   typedef T type;
 | 
						|
};
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct remove_reference< rv<T> &>
 | 
						|
{
 | 
						|
   typedef T type;
 | 
						|
};
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct remove_reference< const rv<T> &>
 | 
						|
{
 | 
						|
   typedef T type;
 | 
						|
};
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             remove_pointer
 | 
						|
//////////////////////////////////////
 | 
						|
 | 
						|
template< class T > struct remove_pointer                    { typedef T type;   };
 | 
						|
template< class T > struct remove_pointer<T*>                { typedef T type;   };
 | 
						|
template< class T > struct remove_pointer<T* const>          { typedef T type;   };
 | 
						|
template< class T > struct remove_pointer<T* volatile>       { typedef T type;   };
 | 
						|
template< class T > struct remove_pointer<T* const volatile> { typedef T type;   };
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             add_pointer
 | 
						|
//////////////////////////////////////
 | 
						|
template< class T >
 | 
						|
struct add_pointer
 | 
						|
{
 | 
						|
   typedef typename remove_reference<T>::type* type;
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             add_const
 | 
						|
//////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct add_const
 | 
						|
{
 | 
						|
   typedef const T type;
 | 
						|
};
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct add_const<T&>
 | 
						|
{
 | 
						|
   typedef const T& type;
 | 
						|
};
 | 
						|
 | 
						|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct add_const<T&&>
 | 
						|
{
 | 
						|
   typedef T&& type;
 | 
						|
};
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//      add_lvalue_reference
 | 
						|
//////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct add_lvalue_reference
 | 
						|
{  typedef T& type;  };
 | 
						|
 | 
						|
template<class T> struct add_lvalue_reference<T&>                 {  typedef T& type;  };
 | 
						|
template<>        struct add_lvalue_reference<void>               {  typedef void type;   };
 | 
						|
template<>        struct add_lvalue_reference<const void>         {  typedef const void type;  };
 | 
						|
template<>        struct add_lvalue_reference<volatile void>      {  typedef volatile void type;   };
 | 
						|
template<>        struct add_lvalue_reference<const volatile void>{  typedef const volatile void type;   };
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct add_const_lvalue_reference
 | 
						|
{
 | 
						|
   typedef typename remove_reference<T>::type         t_unreferenced;
 | 
						|
   typedef typename add_const<t_unreferenced>::type   t_unreferenced_const;
 | 
						|
   typedef typename add_lvalue_reference
 | 
						|
      <t_unreferenced_const>::type                    type;
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             is_lvalue_reference
 | 
						|
//////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct is_lvalue_reference
 | 
						|
{
 | 
						|
    static const bool value = false;
 | 
						|
};
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct is_lvalue_reference<T&>
 | 
						|
{
 | 
						|
    static const bool value = true;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             identity
 | 
						|
//////////////////////////////////////
 | 
						|
template <class T>
 | 
						|
struct identity
 | 
						|
{
 | 
						|
   typedef T type;
 | 
						|
   typedef typename add_const_lvalue_reference<T>::type reference;
 | 
						|
   reference operator()(reference t)
 | 
						|
   {  return t;   }
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//          is_class_or_union
 | 
						|
//////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct is_class_or_union
 | 
						|
{
 | 
						|
   struct twochar { char dummy[2]; };
 | 
						|
   template <class U>
 | 
						|
   static char is_class_or_union_tester(void(U::*)(void));
 | 
						|
   template <class U>
 | 
						|
   static twochar is_class_or_union_tester(...);
 | 
						|
   static const bool value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(char);
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//             addressof
 | 
						|
//////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct addr_impl_ref
 | 
						|
{
 | 
						|
   T & v_;
 | 
						|
   BOOST_MOVE_FORCEINLINE addr_impl_ref( T & v ): v_( v ) {}
 | 
						|
   BOOST_MOVE_FORCEINLINE operator T& () const { return v_; }
 | 
						|
 | 
						|
   private:
 | 
						|
   addr_impl_ref & operator=(const addr_impl_ref &);
 | 
						|
};
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct addressof_impl
 | 
						|
{
 | 
						|
   BOOST_MOVE_FORCEINLINE static T * f( T & v, long )
 | 
						|
   {
 | 
						|
      return reinterpret_cast<T*>(
 | 
						|
         &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
 | 
						|
   }
 | 
						|
 | 
						|
   BOOST_MOVE_FORCEINLINE static T * f( T * v, int )
 | 
						|
   {  return v;  }
 | 
						|
};
 | 
						|
 | 
						|
template<class T>
 | 
						|
BOOST_MOVE_FORCEINLINE T * addressof( T & v )
 | 
						|
{
 | 
						|
   return ::boost::move_detail::addressof_impl<T>::f
 | 
						|
      ( ::boost::move_detail::addr_impl_ref<T>( v ), 0 );
 | 
						|
}
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//          has_pointer_type
 | 
						|
//////////////////////////////////////
 | 
						|
template <class T>
 | 
						|
struct has_pointer_type
 | 
						|
{
 | 
						|
   struct two { char c[2]; };
 | 
						|
   template <class U> static two test(...);
 | 
						|
   template <class U> static char test(typename U::pointer* = 0);
 | 
						|
   static const bool value = sizeof(test<T>(0)) == 1;
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////
 | 
						|
//           is_convertible
 | 
						|
//////////////////////////////////////
 | 
						|
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
 | 
						|
 | 
						|
//use intrinsic since in MSVC
 | 
						|
//overaligned types can't go through ellipsis
 | 
						|
template <class T, class U>
 | 
						|
struct is_convertible
 | 
						|
{
 | 
						|
   static const bool value = __is_convertible_to(T, U);
 | 
						|
};
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
template <class T, class U>
 | 
						|
class is_convertible
 | 
						|
{
 | 
						|
   typedef typename add_lvalue_reference<T>::type t_reference;
 | 
						|
   typedef char true_t;
 | 
						|
   class false_t { char dummy[2]; };
 | 
						|
   static false_t dispatch(...);
 | 
						|
   static true_t  dispatch(U);
 | 
						|
   static t_reference       trigger();
 | 
						|
   public:
 | 
						|
   static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
 | 
						|
};
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
template <class T, class U, bool IsSame = is_same<T, U>::value>
 | 
						|
struct is_same_or_convertible
 | 
						|
   : is_convertible<T, U>
 | 
						|
{};
 | 
						|
 | 
						|
template <class T, class U>
 | 
						|
struct is_same_or_convertible<T, U, true>
 | 
						|
{
 | 
						|
   static const bool value = true;
 | 
						|
};
 | 
						|
 | 
						|
template<
 | 
						|
      bool C
 | 
						|
    , typename F1
 | 
						|
    , typename F2
 | 
						|
    >
 | 
						|
struct eval_if_c
 | 
						|
    : if_c<C,F1,F2>::type
 | 
						|
{};
 | 
						|
 | 
						|
template<
 | 
						|
      typename C
 | 
						|
    , typename T1
 | 
						|
    , typename T2
 | 
						|
    >
 | 
						|
struct eval_if
 | 
						|
    : if_<C,T1,T2>::type
 | 
						|
{};
 | 
						|
 | 
						|
 | 
						|
#if defined(BOOST_GCC) && (BOOST_GCC <= 40000)
 | 
						|
#define BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN
 | 
						|
#endif
 | 
						|
 | 
						|
template<class T, class U, class R = void>
 | 
						|
struct enable_if_convertible
 | 
						|
   : enable_if< is_convertible<T, U>, R>
 | 
						|
{};
 | 
						|
 | 
						|
template<class T, class U, class R = void>
 | 
						|
struct disable_if_convertible
 | 
						|
   : disable_if< is_convertible<T, U>, R>
 | 
						|
{};
 | 
						|
 | 
						|
template<class T, class U, class R = void>
 | 
						|
struct enable_if_same_or_convertible
 | 
						|
   : enable_if< is_same_or_convertible<T, U>, R>
 | 
						|
{};
 | 
						|
 | 
						|
template<class T, class U, class R = void>
 | 
						|
struct disable_if_same_or_convertible
 | 
						|
   : disable_if< is_same_or_convertible<T, U>, R>
 | 
						|
{};
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//                         and_
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
template<bool, class B = true_, class C = true_, class D = true_>
 | 
						|
struct and_impl
 | 
						|
   : and_impl<B::value, C, D>
 | 
						|
{};
 | 
						|
 | 
						|
template<>
 | 
						|
struct and_impl<true, true_, true_, true_>
 | 
						|
{
 | 
						|
   static const bool value = true;
 | 
						|
};
 | 
						|
 | 
						|
template<class B, class C, class D>
 | 
						|
struct and_impl<false, B, C, D>
 | 
						|
{
 | 
						|
   static const bool value = false;
 | 
						|
};
 | 
						|
 | 
						|
template<class A, class B, class C = true_, class D = true_>
 | 
						|
struct and_
 | 
						|
   : and_impl<A::value, B, C, D>
 | 
						|
{};
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//                            or_
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
template<bool, class B = false_, class C = false_, class D = false_>
 | 
						|
struct or_impl
 | 
						|
   : or_impl<B::value, C, D>
 | 
						|
{};
 | 
						|
 | 
						|
template<>
 | 
						|
struct or_impl<false, false_, false_, false_>
 | 
						|
{
 | 
						|
   static const bool value = false;
 | 
						|
};
 | 
						|
 | 
						|
template<class B, class C, class D>
 | 
						|
struct or_impl<true, B, C, D>
 | 
						|
{
 | 
						|
   static const bool value = true;
 | 
						|
};
 | 
						|
 | 
						|
template<class A, class B, class C = false_, class D = false_>
 | 
						|
struct or_
 | 
						|
   : or_impl<A::value, B, C, D>
 | 
						|
{};
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//                         not_
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct not_
 | 
						|
{
 | 
						|
   static const bool value = !T::value;
 | 
						|
};
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
// enable_if_and / disable_if_and / enable_if_or / disable_if_or
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
template<class R, class A, class B, class C = true_, class D = true_>
 | 
						|
struct enable_if_and
 | 
						|
   : enable_if_c< and_<A, B, C, D>::value, R>
 | 
						|
{};
 | 
						|
 | 
						|
template<class R, class A, class B, class C = true_, class D = true_>
 | 
						|
struct disable_if_and
 | 
						|
   : disable_if_c< and_<A, B, C, D>::value, R>
 | 
						|
{};
 | 
						|
 | 
						|
template<class R, class A, class B, class C = false_, class D = false_>
 | 
						|
struct enable_if_or
 | 
						|
   : enable_if_c< or_<A, B, C, D>::value, R>
 | 
						|
{};
 | 
						|
 | 
						|
template<class R, class A, class B, class C = false_, class D = false_>
 | 
						|
struct disable_if_or
 | 
						|
   : disable_if_c< or_<A, B, C, D>::value, R>
 | 
						|
{};
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//                      has_move_emulation_enabled_impl
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
template<class T>
 | 
						|
struct has_move_emulation_enabled_impl
 | 
						|
   : is_convertible< T, ::boost::rv<T>& >
 | 
						|
{};
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct has_move_emulation_enabled_impl<T&>
 | 
						|
{  static const bool value = false;  };
 | 
						|
 | 
						|
template<class T>
 | 
						|
struct has_move_emulation_enabled_impl< ::boost::rv<T> >
 | 
						|
{  static const bool value = false;  };
 | 
						|
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//                            is_rv_impl
 | 
						|
//
 | 
						|
//////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
template <class T>
 | 
						|
struct is_rv_impl
 | 
						|
{  static const bool value = false;  };
 | 
						|
 | 
						|
template <class T>
 | 
						|
struct is_rv_impl< rv<T> >
 | 
						|
{  static const bool value = true;  };
 | 
						|
 | 
						|
template <class T>
 | 
						|
struct is_rv_impl< const rv<T> >
 | 
						|
{  static const bool value = true;  };
 | 
						|
 | 
						|
// Code from Jeffrey Lee Hellrung, many thanks
 | 
						|
 | 
						|
template< class T >
 | 
						|
struct is_rvalue_reference
 | 
						|
{  static const bool value = false;  };
 | 
						|
 | 
						|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
template< class T >
 | 
						|
struct is_rvalue_reference< T&& >
 | 
						|
{  static const bool value = true;  };
 | 
						|
 | 
						|
#else // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
template< class T >
 | 
						|
struct is_rvalue_reference< boost::rv<T>& >
 | 
						|
{  static const bool value = true;  };
 | 
						|
 | 
						|
template< class T >
 | 
						|
struct is_rvalue_reference< const boost::rv<T>& >
 | 
						|
{  static const bool value = true;  };
 | 
						|
 | 
						|
#endif // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
template< class T >
 | 
						|
struct add_rvalue_reference
 | 
						|
{ typedef T&& type; };
 | 
						|
 | 
						|
#else // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
namespace detail_add_rvalue_reference
 | 
						|
{
 | 
						|
   template< class T
 | 
						|
            , bool emulation = has_move_emulation_enabled_impl<T>::value
 | 
						|
            , bool rv        = is_rv_impl<T>::value  >
 | 
						|
   struct add_rvalue_reference_impl { typedef T type; };
 | 
						|
 | 
						|
   template< class T, bool emulation>
 | 
						|
   struct add_rvalue_reference_impl< T, emulation, true > { typedef T & type; };
 | 
						|
 | 
						|
   template< class T, bool rv >
 | 
						|
   struct add_rvalue_reference_impl< T, true, rv > { typedef ::boost::rv<T>& type; };
 | 
						|
} // namespace detail_add_rvalue_reference
 | 
						|
 | 
						|
template< class T >
 | 
						|
struct add_rvalue_reference
 | 
						|
   : detail_add_rvalue_reference::add_rvalue_reference_impl<T>
 | 
						|
{ };
 | 
						|
 | 
						|
template< class T >
 | 
						|
struct add_rvalue_reference<T &>
 | 
						|
{  typedef T & type; };
 | 
						|
 | 
						|
#endif // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
template< class T > struct remove_rvalue_reference { typedef T type; };
 | 
						|
 | 
						|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
   template< class T > struct remove_rvalue_reference< T&& >                  { typedef T type; };
 | 
						|
#else // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
   template< class T > struct remove_rvalue_reference< rv<T> >                { typedef T type; };
 | 
						|
   template< class T > struct remove_rvalue_reference< const rv<T> >          { typedef T type; };
 | 
						|
   template< class T > struct remove_rvalue_reference< volatile rv<T> >       { typedef T type; };
 | 
						|
   template< class T > struct remove_rvalue_reference< const volatile rv<T> > { typedef T type; };
 | 
						|
   template< class T > struct remove_rvalue_reference< rv<T>& >               { typedef T type; };
 | 
						|
   template< class T > struct remove_rvalue_reference< const rv<T>& >         { typedef T type; };
 | 
						|
   template< class T > struct remove_rvalue_reference< volatile rv<T>& >      { typedef T type; };
 | 
						|
   template< class T > struct remove_rvalue_reference< const volatile rv<T>& >{ typedef T type; };
 | 
						|
#endif // #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
 | 
						|
 | 
						|
// Ideas from Boost.Move review, Jeffrey Lee Hellrung:
 | 
						|
//
 | 
						|
//- TypeTraits metafunctions is_lvalue_reference, add_lvalue_reference, and remove_lvalue_reference ?
 | 
						|
//  Perhaps add_reference and remove_reference can be modified so that they behave wrt emulated rvalue
 | 
						|
//  references the same as wrt real rvalue references, i.e., add_reference< rv<T>& > -> T& rather than
 | 
						|
//  rv<T>& (since T&& & -> T&).
 | 
						|
//
 | 
						|
//- Add'l TypeTraits has_[trivial_]move_{constructor,assign}...?
 | 
						|
//
 | 
						|
//- An as_lvalue(T& x) function, which amounts to an identity operation in C++0x, but strips emulated
 | 
						|
//  rvalue references in C++03.  This may be necessary to prevent "accidental moves".
 | 
						|
 | 
						|
}  //namespace move_detail {
 | 
						|
}  //namespace boost {
 | 
						|
 | 
						|
#include <boost/move/detail/config_end.hpp>
 | 
						|
 | 
						|
#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_HPP
 |