65 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//  add_rvalue_reference.hpp  ---------------------------------------------------------//
 | 
						|
 | 
						|
//  Copyright 2010 Vicente J. Botet Escriba
 | 
						|
 | 
						|
//  Distributed under the Boost Software License, Version 1.0.
 | 
						|
//  See http://www.boost.org/LICENSE_1_0.txt
 | 
						|
 | 
						|
#ifndef BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
 | 
						|
#define BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
 | 
						|
 | 
						|
#include <boost/config.hpp>
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
#include <boost/type_traits/is_void.hpp>
 | 
						|
#include <boost/type_traits/is_reference.hpp>
 | 
						|
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
//                                                                            //
 | 
						|
//                           C++03 implementation of                          //
 | 
						|
//             20.9.7.2 Reference modifications [meta.trans.ref]              //
 | 
						|
//                          Written by Vicente J. Botet Escriba               //
 | 
						|
//                                                                            //
 | 
						|
// If T names an object or function type then the member typedef type
 | 
						|
// shall name T&&; otherwise, type shall name T. [ Note: This rule reflects
 | 
						|
// the semantics of reference collapsing. For example, when a type T names
 | 
						|
// a type T1&, the type add_rvalue_reference<T>::type is not an rvalue
 | 
						|
// reference. -end note ]
 | 
						|
//----------------------------------------------------------------------------//
 | 
						|
 | 
						|
namespace boost {
 | 
						|
 | 
						|
namespace type_traits_detail {
 | 
						|
 | 
						|
    template <typename T, bool b>
 | 
						|
    struct add_rvalue_reference_helper
 | 
						|
    { typedef T   type; };
 | 
						|
 | 
						|
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
						|
    template <typename T>
 | 
						|
    struct add_rvalue_reference_helper<T, true>
 | 
						|
    {
 | 
						|
        typedef T&&   type;
 | 
						|
    };
 | 
						|
#endif
 | 
						|
 | 
						|
    template <typename T>
 | 
						|
    struct add_rvalue_reference_imp
 | 
						|
    {
 | 
						|
       typedef typename boost::type_traits_detail::add_rvalue_reference_helper
 | 
						|
                  <T, (is_void<T>::value == false && is_reference<T>::value == false) >::type type;
 | 
						|
    };
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
template <class T> struct add_rvalue_reference
 | 
						|
{
 | 
						|
   typedef typename boost::type_traits_detail::add_rvalue_reference_imp<T>::type type;
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace boost
 | 
						|
 | 
						|
#endif  // BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
 | 
						|
 |