133 lines
5.0 KiB
Plaintext
133 lines
5.0 KiB
Plaintext
|
|
// (C) Copyright Tobias Schwinger
|
|
//
|
|
// Use modification and distribution are subject to the boost Software License,
|
|
// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
#ifndef BOOST_FT_DETAIL_CV_TRAITS_HPP_INCLUDED
|
|
#define BOOST_FT_DETAIL_CV_TRAITS_HPP_INCLUDED
|
|
|
|
#include <cstddef>
|
|
#include <boost/detail/workaround.hpp>
|
|
|
|
#if BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
|
|
# include <boost/type_traits/remove_cv.hpp>
|
|
# include <boost/type_traits/remove_pointer.hpp>
|
|
# include <boost/type_traits/remove_reference.hpp>
|
|
#endif
|
|
|
|
#include <boost/function_types/property_tags.hpp>
|
|
|
|
namespace boost { namespace function_types { namespace detail {
|
|
|
|
#if !BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
|
|
|
|
template<typename T> struct cv_traits
|
|
{ typedef non_cv tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T &>
|
|
{ typedef non_cv tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T *>
|
|
{ typedef non_cv tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T * const>
|
|
{ typedef non_cv tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T * volatile>
|
|
{ typedef non_cv tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T * const volatile>
|
|
{ typedef non_cv tag; typedef T type; };
|
|
|
|
template<typename T> struct cv_traits<T const>
|
|
{ typedef const_non_volatile tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const &>
|
|
{ typedef const_non_volatile tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const *>
|
|
{ typedef const_non_volatile tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const * const>
|
|
{ typedef const_non_volatile tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const * volatile>
|
|
{ typedef const_non_volatile tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const * const volatile>
|
|
{ typedef const_non_volatile tag; typedef T type; };
|
|
|
|
template<typename T> struct cv_traits<T volatile>
|
|
{ typedef volatile_non_const tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T volatile &>
|
|
{ typedef volatile_non_const tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T volatile *>
|
|
{ typedef volatile_non_const tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T volatile * const>
|
|
{ typedef volatile_non_const tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T volatile * volatile>
|
|
{ typedef volatile_non_const tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T volatile * const volatile>
|
|
{ typedef volatile_non_const tag; typedef T type; };
|
|
|
|
template<typename T> struct cv_traits<T const volatile>
|
|
{ typedef cv_qualified tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const volatile &>
|
|
{ typedef cv_qualified tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const volatile *>
|
|
{ typedef cv_qualified tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const volatile * const>
|
|
{ typedef cv_qualified tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const volatile * volatile>
|
|
{ typedef cv_qualified tag; typedef T type; };
|
|
template<typename T> struct cv_traits<T const volatile * const volatile>
|
|
{ typedef cv_qualified tag; typedef T type; };
|
|
|
|
#else
|
|
template<std::size_t> struct cv_tag_impl;
|
|
|
|
template<> struct cv_tag_impl<1> { typedef non_cv type;};
|
|
template<> struct cv_tag_impl<2> { typedef const_non_volatile type; };
|
|
template<> struct cv_tag_impl<3> { typedef volatile_non_const type; };
|
|
template<> struct cv_tag_impl<4> { typedef cv_qualified type; };
|
|
|
|
typedef char (& case_1)[1];
|
|
typedef char (& case_2)[2];
|
|
typedef char (& case_3)[3];
|
|
typedef char (& case_4)[4];
|
|
|
|
template<typename T> case_1 switch_cv(T *);
|
|
template<typename T> case_2 switch_cv(T const *);
|
|
template<typename T> case_3 switch_cv(T volatile *);
|
|
template<typename T> case_4 switch_cv(T const volatile *);
|
|
|
|
template<typename T> T * ref_to_ptr(T &);
|
|
template<typename T> T const * ref_to_ptr(T const &);
|
|
template<typename T> T volatile * ref_to_ptr(T volatile &);
|
|
template<typename T> T const volatile * ref_to_ptr(T const volatile &);
|
|
|
|
template<typename T> T * ref_to_ptr(T * const volatile &);
|
|
|
|
template<typename T>
|
|
struct cv_code
|
|
{
|
|
static T _t;
|
|
BOOST_STATIC_CONSTANT(std::size_t, value =
|
|
sizeof(::boost::function_types::detail::switch_cv(
|
|
::boost::function_types::detail::ref_to_ptr(_t) ) ));
|
|
};
|
|
|
|
template<typename T> struct cv_traits
|
|
{
|
|
typedef typename boost::function_types::detail::cv_tag_impl<
|
|
::boost::function_types::detail::cv_code<T>::value >::type
|
|
tag;
|
|
|
|
// may require Boost.TypeTraits broken compiler specializations
|
|
// to work
|
|
typedef typename boost::remove_cv<
|
|
typename boost::remove_pointer<
|
|
typename boost::remove_reference<T>::type
|
|
>::type
|
|
>::type type;
|
|
};
|
|
#endif
|
|
|
|
} } } // namespace boost::function_types::detail
|
|
|
|
#endif
|
|
|