121 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			121 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //----------------------------------------------------------------------------- | ||
|  | // boost detail/reference_content.hpp header file | ||
|  | // See http://www.boost.org for updates, documentation, and revision history. | ||
|  | //----------------------------------------------------------------------------- | ||
|  | // | ||
|  | // Copyright (c) 2003 | ||
|  | // Eric Friedman | ||
|  | // | ||
|  | // 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) | ||
|  | 
 | ||
|  | #ifndef BOOST_DETAIL_REFERENCE_CONTENT_HPP | ||
|  | #define BOOST_DETAIL_REFERENCE_CONTENT_HPP | ||
|  | 
 | ||
|  | #include "boost/config.hpp" | ||
|  | 
 | ||
|  | #   include "boost/mpl/bool.hpp" | ||
|  | #   include "boost/type_traits/has_nothrow_copy.hpp" | ||
|  | 
 | ||
|  | #include "boost/mpl/void.hpp" | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | 
 | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | // (detail) class template reference_content | ||
|  | // | ||
|  | // Non-Assignable wrapper for references. | ||
|  | // | ||
|  | template <typename RefT> | ||
|  | class reference_content | ||
|  | { | ||
|  | private: // representation | ||
|  | 
 | ||
|  |     RefT content_; | ||
|  | 
 | ||
|  | public: // structors | ||
|  | 
 | ||
|  |     ~reference_content() | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     reference_content(RefT r) | ||
|  |         : content_( r ) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     reference_content(const reference_content& operand) | ||
|  |         : content_( operand.content_ ) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  | private: // non-Assignable | ||
|  | 
 | ||
|  |     reference_content& operator=(const reference_content&); | ||
|  | 
 | ||
|  | public: // queries | ||
|  | 
 | ||
|  |     RefT get() const | ||
|  |     { | ||
|  |         return content_; | ||
|  |     } | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | // (detail) metafunction make_reference_content | ||
|  | // | ||
|  | // Wraps with reference_content if specified type is reference. | ||
|  | // | ||
|  | 
 | ||
|  | template <typename T = mpl::void_> struct make_reference_content; | ||
|  | 
 | ||
|  | 
 | ||
|  | template <typename T> | ||
|  | struct make_reference_content | ||
|  | { | ||
|  |     typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | template <typename T> | ||
|  | struct make_reference_content< T& > | ||
|  | { | ||
|  |     typedef reference_content<T&> type; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | template <> | ||
|  | struct make_reference_content< mpl::void_ > | ||
|  | { | ||
|  |     template <typename T> | ||
|  |     struct apply | ||
|  |         : make_reference_content<T> | ||
|  |     { | ||
|  |     }; | ||
|  | 
 | ||
|  |     typedef mpl::void_ type; | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace detail | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | // reference_content<T&> type traits specializations | ||
|  | // | ||
|  | 
 | ||
|  | 
 | ||
|  | template <typename T> | ||
|  | struct has_nothrow_copy< | ||
|  |       ::boost::detail::reference_content< T& > | ||
|  |     > | ||
|  |     : mpl::true_ | ||
|  | { | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP |