1
0
forked from boostorg/core
Files
boost_core/include/boost/ref.hpp

121 lines
2.6 KiB
C++
Raw Normal View History

2001-08-23 18:42:16 +00:00
#ifndef BOOST_REF_HPP_INCLUDED
2003-11-28 15:35:21 +00:00
#define BOOST_REF_HPP_INCLUDED
2001-08-23 18:42:16 +00:00
2003-11-28 15:35:21 +00:00
// MS compatible compilers support #pragma once
2001-08-23 18:42:16 +00:00
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
2003-11-28 15:35:21 +00:00
# pragma once
#endif
#include <boost/config.hpp>
#include <boost/utility/addressof.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/detail/workaround.hpp>
2001-08-23 18:42:16 +00:00
//
2001-08-23 19:05:21 +00:00
// ref.hpp - ref/cref, useful helper functions
2001-08-23 18:42:16 +00:00
//
// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
2002-04-13 13:19:57 +00:00
// Copyright (C) 2001, 2002 Peter Dimov
2002-03-09 20:34:06 +00:00
// Copyright (C) 2002 David Abrahams
2001-08-23 18:42:16 +00:00
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
2001-08-23 18:42:16 +00:00
//
2001-08-23 19:05:21 +00:00
// See http://www.boost.org/libs/bind/ref.html for documentation.
2001-08-23 18:42:16 +00:00
//
namespace boost
{
template<class T> class reference_wrapper
{
2001-08-23 18:42:16 +00:00
public:
typedef T type;
2001-08-23 18:42:16 +00:00
BOOST_FORCEINLINE explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
2001-08-23 18:42:16 +00:00
BOOST_FORCEINLINE operator T& () const { return *t_; }
2001-08-23 18:42:16 +00:00
BOOST_FORCEINLINE T& get() const { return *t_; }
2001-08-23 18:42:16 +00:00
BOOST_FORCEINLINE T* get_pointer() const { return t_; }
2001-08-23 18:42:16 +00:00
private:
T* t_;
2001-08-23 18:42:16 +00:00
};
# if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
# define BOOST_REF_CONST
# else
# define BOOST_REF_CONST const
# endif
template<class T> BOOST_FORCEINLINE reference_wrapper<T> BOOST_REF_CONST ref(T & t)
{
2001-08-23 19:05:21 +00:00
return reference_wrapper<T>(t);
2001-08-23 18:42:16 +00:00
}
template<class T> BOOST_FORCEINLINE reference_wrapper<T const> BOOST_REF_CONST cref(T const & t)
2001-08-23 18:42:16 +00:00
{
2001-08-23 19:05:21 +00:00
return reference_wrapper<T const>(t);
2001-08-23 18:42:16 +00:00
}
# undef BOOST_REF_CONST
2004-11-28 03:35:12 +00:00
template<typename T>
class is_reference_wrapper
: public mpl::false_
{
};
template<typename T>
class unwrap_reference
{
public:
typedef T type;
};
2004-11-28 03:35:12 +00:00
# define AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(X) \
template<typename T> \
class is_reference_wrapper< X > \
: public mpl::true_ \
{ \
}; \
\
template<typename T> \
class unwrap_reference< X > \
{ \
public: \
typedef T type; \
}; \
/**/
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T>)
#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> const)
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> volatile)
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> const volatile)
#endif
# undef AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF
template <class T> BOOST_FORCEINLINE typename unwrap_reference<T>::type&
2008-07-10 19:28:49 +00:00
unwrap_ref(T& t)
{
return t;
}
template<class T> BOOST_FORCEINLINE T* get_pointer( reference_wrapper<T> const & r )
{
return r.get_pointer();
}
2001-08-23 18:42:16 +00:00
} // namespace boost
#endif // #ifndef BOOST_REF_HPP_INCLUDED