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 | ||
|  | 
 |