williamr@2: #ifndef BOOST_REF_HPP_INCLUDED williamr@2: #define BOOST_REF_HPP_INCLUDED williamr@2: williamr@2: // MS compatible compilers support #pragma once williamr@2: williamr@2: #if defined(_MSC_VER) && (_MSC_VER >= 1020) williamr@2: # pragma once williamr@2: #endif williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: // williamr@2: // ref.hpp - ref/cref, useful helper functions williamr@2: // williamr@2: // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) williamr@2: // Copyright (C) 2001, 2002 Peter Dimov williamr@2: // Copyright (C) 2002 David Abrahams williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // See http://www.boost.org/libs/bind/ref.html for documentation. williamr@2: // williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: williamr@2: template class reference_wrapper williamr@2: { williamr@2: public: williamr@2: typedef T type; williamr@2: williamr@2: #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 ) williamr@2: williamr@2: explicit reference_wrapper(T& t): t_(&t) {} williamr@2: williamr@2: #else williamr@2: williamr@2: explicit reference_wrapper(T& t): t_(boost::addressof(t)) {} williamr@2: williamr@2: #endif williamr@2: williamr@2: operator T& () const { return *t_; } williamr@2: williamr@2: T& get() const { return *t_; } williamr@2: williamr@2: T* get_pointer() const { return t_; } williamr@2: williamr@2: private: williamr@2: williamr@2: T* t_; williamr@2: }; williamr@2: williamr@2: # if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) ) williamr@2: # define BOOST_REF_CONST williamr@2: # else williamr@2: # define BOOST_REF_CONST const williamr@2: # endif williamr@2: williamr@2: template inline reference_wrapper BOOST_REF_CONST ref(T & t) williamr@2: { williamr@2: return reference_wrapper(t); williamr@2: } williamr@2: williamr@2: template inline reference_wrapper BOOST_REF_CONST cref(T const & t) williamr@2: { williamr@2: return reference_wrapper(t); williamr@2: } williamr@2: williamr@2: # undef BOOST_REF_CONST williamr@2: williamr@2: # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@2: williamr@2: template williamr@2: class is_reference_wrapper williamr@2: : public mpl::false_ williamr@2: { williamr@2: }; williamr@2: williamr@2: template williamr@2: class unwrap_reference williamr@2: { williamr@2: public: williamr@2: typedef T type; williamr@2: }; williamr@2: williamr@2: # define AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(X) \ williamr@2: template \ williamr@2: class is_reference_wrapper< X > \ williamr@2: : public mpl::true_ \ williamr@2: { \ williamr@2: }; \ williamr@2: \ williamr@2: template \ williamr@2: class unwrap_reference< X > \ williamr@2: { \ williamr@2: public: \ williamr@2: typedef T type; \ williamr@2: }; \ williamr@2: /**/ williamr@2: williamr@2: AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper) williamr@2: #if !defined(BOOST_NO_CV_SPECIALIZATIONS) williamr@2: AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper const) williamr@2: AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper volatile) williamr@2: AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper const volatile) williamr@2: #endif williamr@2: williamr@2: # undef AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF williamr@2: williamr@2: # else // no partial specialization williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #include williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: williamr@2: namespace detail williamr@2: { williamr@2: typedef char (&yes_reference_wrapper_t)[1]; williamr@2: typedef char (&no_reference_wrapper_t)[2]; williamr@2: williamr@2: no_reference_wrapper_t is_reference_wrapper_test(...); williamr@2: williamr@2: template williamr@2: yes_reference_wrapper_t is_reference_wrapper_test(type< reference_wrapper >); williamr@2: williamr@2: template williamr@2: struct reference_unwrapper williamr@2: { williamr@2: template williamr@2: struct apply williamr@2: { williamr@2: typedef T type; williamr@2: }; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct reference_unwrapper williamr@2: { williamr@2: template williamr@2: struct apply williamr@2: { williamr@2: typedef typename T::type type; williamr@2: }; williamr@2: }; williamr@2: } williamr@2: williamr@2: template williamr@2: class is_reference_wrapper williamr@2: { williamr@2: public: williamr@2: BOOST_STATIC_CONSTANT( williamr@2: bool, value = ( williamr@2: sizeof(detail::is_reference_wrapper_test(type())) williamr@2: == sizeof(detail::yes_reference_wrapper_t))); williamr@2: williamr@2: typedef ::boost::mpl::bool_ type; williamr@2: }; williamr@2: williamr@2: template williamr@2: class unwrap_reference williamr@2: : public detail::reference_unwrapper< williamr@2: is_reference_wrapper::value williamr@2: >::template apply williamr@2: {}; williamr@2: williamr@2: # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // #ifndef BOOST_REF_HPP_INCLUDED