1 #ifndef BOOST_REF_HPP_INCLUDED
2 #define BOOST_REF_HPP_INCLUDED
4 // MS compatible compilers support #pragma once
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
10 #include <boost/config.hpp>
11 #include <boost/utility/addressof.hpp>
12 #include <boost/mpl/bool.hpp>
13 #include <boost/detail/workaround.hpp>
16 // ref.hpp - ref/cref, useful helper functions
18 // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
19 // Copyright (C) 2001, 2002 Peter Dimov
20 // Copyright (C) 2002 David Abrahams
22 // Distributed under the Boost Software License, Version 1.0. (See
23 // accompanying file LICENSE_1_0.txt or copy at
24 // http://www.boost.org/LICENSE_1_0.txt)
26 // See http://www.boost.org/libs/bind/ref.html for documentation.
32 template<class T
> class reference_wrapper
37 #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 )
39 explicit reference_wrapper(T
& t
): t_(&t
) {}
43 explicit reference_wrapper(T
& t
): t_(boost::addressof(t
)) {}
47 operator T
& () const { return *t_
; }
49 T
& get() const { return *t_
; }
51 T
* get_pointer() const { return t_
; }
58 # if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
59 # define BOOST_REF_CONST
61 # define BOOST_REF_CONST const
64 template<class T
> inline reference_wrapper
<T
> BOOST_REF_CONST
ref(T
& t
)
66 return reference_wrapper
<T
>(t
);
69 template<class T
> inline reference_wrapper
<T
const> BOOST_REF_CONST
cref(T
const & t
)
71 return reference_wrapper
<T
const>(t
);
74 # undef BOOST_REF_CONST
76 # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
79 class is_reference_wrapper
85 class unwrap_reference
91 # define AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(X) \
92 template<typename T> \
93 class is_reference_wrapper< X > \
98 template<typename T> \
99 class unwrap_reference< X > \
106 AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper
<T
>)
107 #if !defined(BOOST_NO_CV_SPECIALIZATIONS)
108 AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper
<T
> const)
109 AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper
<T
> volatile)
110 AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper
<T
> const volatile)
113 # undef AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF
115 # else // no partial specialization
119 #include <boost/type.hpp>
126 typedef char (&yes_reference_wrapper_t
)[1];
127 typedef char (&no_reference_wrapper_t
)[2];
129 no_reference_wrapper_t
is_reference_wrapper_test(...);
132 yes_reference_wrapper_t
is_reference_wrapper_test(type
< reference_wrapper
<T
> >);
134 template<bool wrapped
>
135 struct reference_unwrapper
145 struct reference_unwrapper
<true>
150 typedef typename
T::type type
;
156 class is_reference_wrapper
159 BOOST_STATIC_CONSTANT(
161 sizeof(detail::is_reference_wrapper_test(type
<T
>()))
162 == sizeof(detail::yes_reference_wrapper_t
)));
164 typedef ::boost::mpl::bool_
<value
> type
;
167 template <typename T
>
168 class unwrap_reference
169 : public detail::reference_unwrapper
<
170 is_reference_wrapper
<T
>::value
174 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
176 template <class T
> inline typename unwrap_reference
<T
>::type
&
182 template<class T
> inline T
* get_pointer( reference_wrapper
<T
> const & r
)
184 return r
.get_pointer();
189 #endif // #ifndef BOOST_REF_HPP_INCLUDED