]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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/mpl/bool.hpp" | |
19 | # include "boost/type_traits/has_nothrow_copy.hpp" | |
20 | ||
21 | #include "boost/mpl/void.hpp" | |
22 | ||
23 | namespace boost { | |
24 | ||
25 | namespace detail { | |
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 | ||
41 | ~reference_content() | |
42 | { | |
43 | } | |
44 | ||
45 | reference_content(RefT r) | |
46 | : content_( r ) | |
47 | { | |
48 | } | |
49 | ||
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 | ||
61 | 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 = mpl::void_> 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< mpl::void_ > | |
92 | { | |
93 | template <typename T> | |
94 | struct apply | |
95 | : make_reference_content<T> | |
96 | { | |
97 | }; | |
98 | ||
99 | typedef mpl::void_ 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 | : mpl::true_ | |
114 | { | |
115 | }; | |
116 | ||
117 | ||
118 | } // namespace boost | |
119 | ||
120 | #endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP |