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>
15 // ref.hpp - ref/cref, useful helper functions
17 // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi)
18 // Copyright (C) 2001, 2002 Peter Dimov
19 // Copyright (C) 2002 David Abrahams
21 // Permission to copy, use, modify, sell and distribute this software
22 // is granted provided this copyright notice appears in all copies.
23 // This software is provided "as is" without express or implied
24 // warranty, and with no claim as to its suitability for any purpose.
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_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__) && (__BORLANDC__ <= 0x570)
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
78 class is_reference_wrapper
84 class is_reference_wrapper<reference_wrapper<T> >
90 class unwrap_reference
97 class unwrap_reference<reference_wrapper<T> >
102 # else // no partial specialization
106 #include <boost/type.hpp>
113 typedef char (&yes_reference_wrapper_t)[1];
114 typedef char (&no_reference_wrapper_t)[2];
116 no_reference_wrapper_t is_reference_wrapper_test(...);
119 yes_reference_wrapper_t is_reference_wrapper_test(type< reference_wrapper<T> >);
121 template<bool wrapped>
122 struct reference_unwrapper
132 struct reference_unwrapper<true>
137 typedef typename T::type type;
143 class is_reference_wrapper
146 BOOST_STATIC_CONSTANT(
148 sizeof(detail::is_reference_wrapper_test(type<T>()))
149 == sizeof(detail::yes_reference_wrapper_t)));
151 typedef ::boost::mpl::bool_<value> type;
154 template <typename T>
155 class unwrap_reference
156 : public detail::reference_unwrapper<
157 is_reference_wrapper<T>::value
161 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
165 #endif // #ifndef BOOST_REF_HPP_INCLUDED