#ifndef BOOST_REF_HPP_INCLUDED # define BOOST_REF_HPP_INCLUDED # if _MSC_VER+0 >= 1020 # pragma once # endif # include // // ref.hpp - ref/cref, useful helper functions // // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) // Copyright (C) 2001 Peter Dimov // Copyright (C) 2002 David Abrahams // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // See http://www.boost.org/libs/bind/ref.html for documentation. // namespace boost { template class reference_wrapper { public: typedef T type; explicit reference_wrapper(T& t): t_(&t) {} operator T& () const { return *t_; } T& get() const { return *t_; } private: T* t_; }; # if defined(__BORLANDC__) && (__BORLANDC__ <= 0x551) # define BOOST_REF_CONST # else # define BOOST_REF_CONST const # endif template inline reference_wrapper BOOST_REF_CONST ref(T & t) { return reference_wrapper(t); } template inline reference_wrapper BOOST_REF_CONST cref(T const & t) { return reference_wrapper(t); } # undef BOOST_REF_CONST # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template class is_reference_wrapper { public: BOOST_STATIC_CONSTANT(bool, value = false); }; template class is_reference_wrapper > { public: BOOST_STATIC_CONSTANT(bool, value = true); }; template class unwrap_reference { public: typedef T type; }; template class unwrap_reference > { public: typedef T type; }; # else // no partial specialization } // namespace boost #include namespace boost { namespace detail { typedef char (&yes_reference_wrapper_t)[1]; typedef char (&no_reference_wrapper_t)[2]; no_reference_wrapper_t is_reference_wrapper_test(...); template yes_reference_wrapper_t is_reference_wrapper_test(type< reference_wrapper >); template struct reference_unwrapper { template struct apply { typedef T type; }; }; template<> struct reference_unwrapper { template struct apply { typedef typename T::type type; }; }; } template class is_reference_wrapper { public: BOOST_STATIC_CONSTANT( bool, value = ( sizeof(detail::is_reference_wrapper_test(type())) == sizeof(detail::yes_reference_wrapper_t))); }; template class unwrap_reference : public detail::reference_unwrapper< is_reference_wrapper::value >::template apply {}; # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION } // namespace boost #endif // #ifndef BOOST_REF_HPP_INCLUDED