302 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			302 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #ifndef BOOST_CORE_REF_HPP | ||
|  | #define BOOST_CORE_REF_HPP | ||
|  | 
 | ||
|  | // MS compatible compilers support #pragma once | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) && (_MSC_VER >= 1020) | ||
|  | # pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/utility/addressof.hpp> | ||
|  | #include <boost/detail/workaround.hpp> | ||
|  | 
 | ||
|  | // | ||
|  | //  ref.hpp - ref/cref, useful helper functions | ||
|  | // | ||
|  | //  Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) | ||
|  | //  Copyright (C) 2001, 2002 Peter Dimov | ||
|  | //  Copyright (C) 2002 David Abrahams | ||
|  | // | ||
|  | //  Copyright (C) 2014 Glen Joseph Fernandes | ||
|  | //  glenfe at live dot com | ||
|  | //  Copyright (C) 2014 Agustin Berge | ||
|  | // | ||
|  | // 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/core/doc/html/core/ref.html for documentation. | ||
|  | // | ||
|  | 
 | ||
|  | /** | ||
|  |  @file | ||
|  | */ | ||
|  | 
 | ||
|  | /** | ||
|  |  Boost namespace. | ||
|  | */ | ||
|  | namespace boost | ||
|  | { | ||
|  | 
 | ||
|  | #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 ) | ||
|  | 
 | ||
|  |     struct ref_workaround_tag {}; | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | // reference_wrapper | ||
|  | 
 | ||
|  | /** | ||
|  |  @brief Contains a reference to an object of type `T`. | ||
|  | 
 | ||
|  |  `reference_wrapper` is primarily used to "feed" references to | ||
|  |  function templates (algorithms) that take their parameter by | ||
|  |  value. It provides an implicit conversion to `T&`, which | ||
|  |  usually allows the function templates to work on references | ||
|  |  unmodified. | ||
|  | */ | ||
|  | template<class T> class reference_wrapper | ||
|  | { | ||
|  | public: | ||
|  |     /** | ||
|  |      Type `T`. | ||
|  |     */ | ||
|  |     typedef T type; | ||
|  | 
 | ||
|  |     /** | ||
|  |      Constructs a `reference_wrapper` object that stores a | ||
|  |      reference to `t`. | ||
|  | 
 | ||
|  |      @remark Does not throw. | ||
|  |     */ | ||
|  |     BOOST_FORCEINLINE explicit reference_wrapper(T& t): t_(boost::addressof(t)) {} | ||
|  | 
 | ||
|  | #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 ) | ||
|  | 
 | ||
|  |     BOOST_FORCEINLINE explicit reference_wrapper( T & t, ref_workaround_tag ): t_( boost::addressof( t ) ) {} | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  |     /** | ||
|  |      @remark Construction from a temporary object is disabled. | ||
|  |     */ | ||
|  |     BOOST_DELETED_FUNCTION(reference_wrapper(T&& t)) | ||
|  | public: | ||
|  | #endif | ||
|  | 
 | ||
|  |     /** | ||
|  |      @return The stored reference. | ||
|  |      @remark Does not throw. | ||
|  |     */ | ||
|  |     BOOST_FORCEINLINE operator T& () const { return *t_; } | ||
|  | 
 | ||
|  |     /** | ||
|  |      @return The stored reference. | ||
|  |      @remark Does not throw. | ||
|  |     */ | ||
|  |     BOOST_FORCEINLINE T& get() const { return *t_; } | ||
|  | 
 | ||
|  |     /** | ||
|  |      @return A pointer to the object referenced by the stored | ||
|  |        reference. | ||
|  |      @remark Does not throw. | ||
|  |     */ | ||
|  |     BOOST_FORCEINLINE T* get_pointer() const { return t_; } | ||
|  | 
 | ||
|  | private: | ||
|  | 
 | ||
|  |     T* t_; | ||
|  | }; | ||
|  | 
 | ||
|  | // ref | ||
|  | 
 | ||
|  | /** | ||
|  |  @cond | ||
|  | */ | ||
|  | #if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) ) | ||
|  | #  define BOOST_REF_CONST | ||
|  | #else | ||
|  | #  define BOOST_REF_CONST const | ||
|  | #endif | ||
|  | /** | ||
|  |  @endcond | ||
|  | */ | ||
|  | 
 | ||
|  | /** | ||
|  |  @return `reference_wrapper<T>(t)` | ||
|  |  @remark Does not throw. | ||
|  | */ | ||
|  | template<class T> BOOST_FORCEINLINE reference_wrapper<T> BOOST_REF_CONST ref( T & t ) | ||
|  | { | ||
|  | #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 ) | ||
|  | 
 | ||
|  |     return reference_wrapper<T>( t, ref_workaround_tag() ); | ||
|  | 
 | ||
|  | #else | ||
|  | 
 | ||
|  |     return reference_wrapper<T>( t ); | ||
|  | 
 | ||
|  | #endif | ||
|  | } | ||
|  | 
 | ||
|  | // cref | ||
|  | 
 | ||
|  | /** | ||
|  |  @return `reference_wrapper<T const>(t)` | ||
|  |  @remark Does not throw. | ||
|  | */ | ||
|  | template<class T> BOOST_FORCEINLINE reference_wrapper<T const> BOOST_REF_CONST cref( T const & t ) | ||
|  | { | ||
|  |     return reference_wrapper<T const>(t); | ||
|  | } | ||
|  | 
 | ||
|  | #undef BOOST_REF_CONST | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  | 
 | ||
|  | /** | ||
|  |  @cond | ||
|  | */ | ||
|  | #if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) | ||
|  | #  define BOOST_REF_DELETE | ||
|  | #else | ||
|  | #  define BOOST_REF_DELETE = delete | ||
|  | #endif | ||
|  | /** | ||
|  |  @endcond | ||
|  | */ | ||
|  | 
 | ||
|  | /** | ||
|  |  @remark Construction from a temporary object is disabled. | ||
|  | */ | ||
|  | template<class T> void ref(T const&&) BOOST_REF_DELETE; | ||
|  | 
 | ||
|  | /** | ||
|  |  @remark Construction from a temporary object is disabled. | ||
|  | */ | ||
|  | template<class T> void cref(T const&&) BOOST_REF_DELETE; | ||
|  | 
 | ||
|  | #undef BOOST_REF_DELETE | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | // is_reference_wrapper | ||
|  | 
 | ||
|  | /** | ||
|  |  @brief Determine if a type `T` is an instantiation of | ||
|  |  `reference_wrapper`. | ||
|  | 
 | ||
|  |  The value static constant will be true if the type `T` is a | ||
|  |  specialization of `reference_wrapper`. | ||
|  | */ | ||
|  | template<typename T> struct is_reference_wrapper | ||
|  | { | ||
|  |     BOOST_STATIC_CONSTANT( bool, value = false ); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  @cond | ||
|  | */ | ||
|  | template<typename T> struct is_reference_wrapper< reference_wrapper<T> > | ||
|  | { | ||
|  |     BOOST_STATIC_CONSTANT( bool, value = true ); | ||
|  | }; | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CV_SPECIALIZATIONS) | ||
|  | 
 | ||
|  | template<typename T> struct is_reference_wrapper< reference_wrapper<T> const > | ||
|  | { | ||
|  |     BOOST_STATIC_CONSTANT( bool, value = true ); | ||
|  | }; | ||
|  | 
 | ||
|  | template<typename T> struct is_reference_wrapper< reference_wrapper<T> volatile > | ||
|  | { | ||
|  |     BOOST_STATIC_CONSTANT( bool, value = true ); | ||
|  | }; | ||
|  | 
 | ||
|  | template<typename T> struct is_reference_wrapper< reference_wrapper<T> const volatile > | ||
|  | { | ||
|  |     BOOST_STATIC_CONSTANT( bool, value = true ); | ||
|  | }; | ||
|  | 
 | ||
|  | #endif // !defined(BOOST_NO_CV_SPECIALIZATIONS) | ||
|  | 
 | ||
|  | /** | ||
|  |  @endcond | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | // unwrap_reference | ||
|  | 
 | ||
|  | /** | ||
|  |  @brief Find the type in a `reference_wrapper`. | ||
|  | 
 | ||
|  |  The `typedef` type is `T::type` if `T` is a | ||
|  |  `reference_wrapper`, `T` otherwise. | ||
|  | */ | ||
|  | template<typename T> struct unwrap_reference | ||
|  | { | ||
|  |     typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  @cond | ||
|  | */ | ||
|  | template<typename T> struct unwrap_reference< reference_wrapper<T> > | ||
|  | { | ||
|  |     typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CV_SPECIALIZATIONS) | ||
|  | 
 | ||
|  | template<typename T> struct unwrap_reference< reference_wrapper<T> const > | ||
|  | { | ||
|  |     typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<typename T> struct unwrap_reference< reference_wrapper<T> volatile > | ||
|  | { | ||
|  |     typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<typename T> struct unwrap_reference< reference_wrapper<T> const volatile > | ||
|  | { | ||
|  |     typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif // !defined(BOOST_NO_CV_SPECIALIZATIONS) | ||
|  | 
 | ||
|  | /** | ||
|  |  @endcond | ||
|  | */ | ||
|  | 
 | ||
|  | // unwrap_ref | ||
|  | 
 | ||
|  | /** | ||
|  |  @return `unwrap_reference<T>::type&(t)` | ||
|  |  @remark Does not throw. | ||
|  | */ | ||
|  | template<class T> BOOST_FORCEINLINE typename unwrap_reference<T>::type& unwrap_ref( T & t ) | ||
|  | { | ||
|  |     return t; | ||
|  | } | ||
|  | 
 | ||
|  | // get_pointer | ||
|  | 
 | ||
|  | /** | ||
|  |  @cond | ||
|  | */ | ||
|  | template<class T> BOOST_FORCEINLINE T* get_pointer( reference_wrapper<T> const & r ) | ||
|  | { | ||
|  |     return r.get_pointer(); | ||
|  | } | ||
|  | /** | ||
|  |  @endcond | ||
|  | */ | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // #ifndef BOOST_CORE_REF_HPP |