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

165 lines
3.1 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
2003-11-28 15:35:21 +00:00
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
#include <boost/config.hpp>
#include <boost/utility/addressof.hpp>
#include <boost/mpl/bool.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
//
2001-08-23 19:05:21 +00:00
// Copyright (C) 1999, 2000 Jaakko J<>rvi (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
{
public:
typedef T type;
2001-08-23 18:42:16 +00:00
2002-04-13 13:19:57 +00:00
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
explicit reference_wrapper(T& t): t_(&t) {}
#else
explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
2001-08-23 18:42:16 +00:00
2002-04-13 13:19:57 +00:00
#endif
operator T& () const { return *t_; }
2001-08-23 18:42:16 +00:00
T& get() const { return *t_; }
2001-08-23 18:42:16 +00:00
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
};
2002-08-25 11:57:37 +00:00
# if defined(__BORLANDC__) && (__BORLANDC__ <= 0x570)
# define BOOST_REF_CONST
# else
# define BOOST_REF_CONST const
# endif
template<class T> inline reference_wrapper<T> BOOST_REF_CONST ref(T & t)
2001-08-23 18:42:16 +00:00
{
2001-08-23 19:05:21 +00:00
return reference_wrapper<T>(t);
2001-08-23 18:42:16 +00:00
}
template<class T> inline 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
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
template<typename T>
class is_reference_wrapper
: public mpl::false_
{
};
template<typename T>
class is_reference_wrapper<reference_wrapper<T> >
: public mpl::true_
{
};
template<typename T>
class unwrap_reference
{
public:
typedef T type;
};
template<typename T>
class unwrap_reference<reference_wrapper<T> >
{
public:
typedef T type;
};
# else // no partial specialization
} // namespace boost
#include <boost/type.hpp>
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<typename T>
yes_reference_wrapper_t is_reference_wrapper_test(type< reference_wrapper<T> >);
template<bool wrapped>
struct reference_unwrapper
{
template <class T>
struct apply
{
typedef T type;
};
};
template<>
struct reference_unwrapper<true>
{
template <class T>
struct apply
{
typedef typename T::type type;
};
};
}
template<typename T>
class is_reference_wrapper
{
public:
BOOST_STATIC_CONSTANT(
bool, value = (
2003-02-25 00:57:33 +00:00
sizeof(detail::is_reference_wrapper_test(type<T>()))
== sizeof(detail::yes_reference_wrapper_t)));
2003-02-25 00:57:33 +00:00
typedef ::boost::mpl::bool_<value> type;
};
template <typename T>
class unwrap_reference
: public detail::reference_unwrapper<
is_reference_wrapper<T>::value
>::template apply<T>
{};
# endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
2001-08-23 18:42:16 +00:00
} // namespace boost
#endif // #ifndef BOOST_REF_HPP_INCLUDED