1 //----------------------------------------------------------------------------- 2 // boost detail/reference_content.hpp header file 3 // See http://www.boost.org for updates, documentation, and revision history. 4 //----------------------------------------------------------------------------- 5 // 6 // Copyright (c) 2003 7 // Eric Friedman 8 // 9 // Distributed under the Boost Software License, Version 1.0. (See 10 // accompanying file LICENSE_1_0.txt or copy at 11 // http://www.boost.org/LICENSE_1_0.txt) 12 13 #ifndef BOOST_DETAIL_REFERENCE_CONTENT_HPP 14 #define BOOST_DETAIL_REFERENCE_CONTENT_HPP 15 16 #include "boost/config.hpp" 17 18 # include "boost/type_traits/integral_constant.hpp" 19 # include "boost/type_traits/has_nothrow_copy.hpp" 20 21 namespace boost { 22 23 namespace detail { 24 25 struct void_type {}; 26 27 /////////////////////////////////////////////////////////////////////////////// 28 // (detail) class template reference_content 29 // 30 // Non-Assignable wrapper for references. 31 // 32 template <typename RefT> 33 class reference_content 34 { 35 private: // representation 36 37 RefT content_; 38 39 public: // structors 40 ~reference_content()41 ~reference_content() 42 { 43 } 44 reference_content(RefT r)45 reference_content(RefT r) 46 : content_( r ) 47 { 48 } 49 reference_content(const reference_content & operand)50 reference_content(const reference_content& operand) 51 : content_( operand.content_ ) 52 { 53 } 54 55 private: // non-Assignable 56 57 reference_content& operator=(const reference_content&); 58 59 public: // queries 60 get() const61 RefT get() const 62 { 63 return content_; 64 } 65 66 }; 67 68 /////////////////////////////////////////////////////////////////////////////// 69 // (detail) metafunction make_reference_content 70 // 71 // Wraps with reference_content if specified type is reference. 72 // 73 74 template <typename T = void_type> struct make_reference_content; 75 76 77 template <typename T> 78 struct make_reference_content 79 { 80 typedef T type; 81 }; 82 83 template <typename T> 84 struct make_reference_content< T& > 85 { 86 typedef reference_content<T&> type; 87 }; 88 89 90 template <> 91 struct make_reference_content< void_type > 92 { 93 template <typename T> 94 struct apply 95 : make_reference_content<T> 96 { 97 }; 98 99 typedef void_type type; 100 }; 101 102 } // namespace detail 103 104 /////////////////////////////////////////////////////////////////////////////// 105 // reference_content<T&> type traits specializations 106 // 107 108 109 template <typename T> 110 struct has_nothrow_copy< 111 ::boost::detail::reference_content< T& > 112 > 113 : boost::true_type 114 { 115 }; 116 117 118 } // namespace boost 119 120 #endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP 121