source: NonGTP/Boost/boost/detail/reference_content.hpp @ 857

Revision 857, 3.1 KB checked in by igarcia, 19 years ago (diff)
Line 
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#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
19#   include "boost/mpl/bool.hpp"
20#   include "boost/type_traits/has_nothrow_copy.hpp"
21#else
22#   include "boost/mpl/if.hpp"
23#   include "boost/type_traits/is_reference.hpp"
24#endif
25
26#include "boost/mpl/void.hpp"
27
28namespace boost {
29
30namespace detail {
31
32///////////////////////////////////////////////////////////////////////////////
33// (detail) class template reference_content
34//
35// Non-Assignable wrapper for references.
36//
37template <typename RefT>
38class reference_content
39{
40private: // representation
41
42    RefT content_;
43
44public: // structors
45
46    ~reference_content()
47    {
48    }
49
50    reference_content(RefT r)
51        : content_( r )
52    {
53    }
54
55    reference_content(const reference_content& operand)
56        : content_( operand.content_ )
57    {
58    }
59
60private: // non-Assignable
61
62    reference_content& operator=(const reference_content&);
63
64public: // queries
65
66    RefT get() const
67    {
68        return content_;
69    }
70
71};
72
73///////////////////////////////////////////////////////////////////////////////
74// (detail) metafunction make_reference_content
75//
76// Wraps with reference_content if specified type is reference.
77//
78
79template <typename T = mpl::void_> struct make_reference_content;
80
81#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
82
83template <typename T>
84struct make_reference_content
85{
86    typedef T type;
87};
88
89template <typename T>
90struct make_reference_content< T& >
91{
92    typedef reference_content<T&> type;
93};
94
95#else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
96
97template <typename T>
98struct make_reference_content
99    : mpl::if_<
100          is_reference<T>
101        , reference_content<T>
102        , T
103        >
104{
105};
106
107#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround
108
109template <>
110struct make_reference_content< mpl::void_ >
111{
112    template <typename T>
113    struct apply
114        : make_reference_content<T>
115    {
116    };
117
118    typedef mpl::void_ type;
119};
120
121} // namespace detail
122
123///////////////////////////////////////////////////////////////////////////////
124// reference_content<T&> type traits specializations
125//
126
127#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
128
129template <typename T>
130struct has_nothrow_copy<
131      ::boost::detail::reference_content< T& >
132    >
133    : mpl::true_
134{
135};
136
137#endif // !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
138
139} // namespace boost
140
141#endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP
Note: See TracBrowser for help on using the repository browser.