Ticket #7317: cv_traits_imp.patch

File cv_traits_imp.patch, 6.3 KB (added by Eric Niebler, 10 years ago)

latest version of the patch

  • boost/type_traits/detail/cv_traits_impl.hpp

     
    1111#ifndef BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
    1212#define BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
    1313
     14#include <cstddef>
    1415#include <boost/config.hpp>
    1516#include <boost/detail/workaround.hpp>
    1617
     
    2930namespace gcc8503 {
    3031#endif
    3132
     33#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
     34#define BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(X) X
     35template <typename T>
     36struct cv_traits_imp
     37{
     38    BOOST_STATIC_CONSTANT(bool, is_const = false);
     39    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
     40    typedef T unqualified_type;
     41};
     42
     43template <typename T>
     44struct cv_traits_imp<T[]>
     45{
     46    BOOST_STATIC_CONSTANT(bool, is_const = false);
     47    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
     48    typedef T unqualified_type[];
     49};
     50
     51template <typename T>
     52struct cv_traits_imp<const T[]>
     53{
     54    BOOST_STATIC_CONSTANT(bool, is_const = true);
     55    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
     56    typedef T unqualified_type[];
     57};
     58
     59template <typename T>
     60struct cv_traits_imp<volatile T[]>
     61{
     62    BOOST_STATIC_CONSTANT(bool, is_const = false);
     63    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
     64    typedef T unqualified_type[];
     65};
     66
     67template <typename T>
     68struct cv_traits_imp<const volatile T[]>
     69{
     70    BOOST_STATIC_CONSTANT(bool, is_const = true);
     71    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
     72    typedef T unqualified_type[];
     73};
     74
     75template <typename T, std::size_t N>
     76struct cv_traits_imp<T[N]>
     77{
     78    BOOST_STATIC_CONSTANT(bool, is_const = false);
     79    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
     80    typedef T unqualified_type[N];
     81};
     82
     83template <typename T, std::size_t N>
     84struct cv_traits_imp<const T[N]>
     85{
     86    BOOST_STATIC_CONSTANT(bool, is_const = true);
     87    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
     88    typedef T unqualified_type[N];
     89};
     90
     91template <typename T, std::size_t N>
     92struct cv_traits_imp<volatile T[N]>
     93{
     94    BOOST_STATIC_CONSTANT(bool, is_const = false);
     95    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
     96    typedef T unqualified_type[N];
     97};
     98
     99template <typename T, std::size_t N>
     100struct cv_traits_imp<const volatile T[N]>
     101{
     102    BOOST_STATIC_CONSTANT(bool, is_const = true);
     103    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
     104    typedef T unqualified_type[N];
     105};
     106
     107#else
     108#define BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(X) X *
    32109template <typename T> struct cv_traits_imp {};
    33110
    34111template <typename T>
     
    38115    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
    39116    typedef T unqualified_type;
    40117};
     118#endif
    41119
    42120template <typename T>
    43 struct cv_traits_imp<const T*>
     121struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(const T)>
    44122{
    45123    BOOST_STATIC_CONSTANT(bool, is_const = true);
    46124    BOOST_STATIC_CONSTANT(bool, is_volatile = false);
     
    48126};
    49127
    50128template <typename T>
    51 struct cv_traits_imp<volatile T*>
     129struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(volatile T)>
    52130{
    53131    BOOST_STATIC_CONSTANT(bool, is_const = false);
    54132    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
     
    56134};
    57135
    58136template <typename T>
    59 struct cv_traits_imp<const volatile T*>
     137struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(const volatile T)>
    60138{
    61139    BOOST_STATIC_CONSTANT(bool, is_const = true);
    62140    BOOST_STATIC_CONSTANT(bool, is_volatile = true);
  • boost/type_traits/is_const.hpp

     
    6161#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
    6262   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<typename boost::remove_bounds<T>::type*>::is_const);
    6363#else
    64    BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<T*>::is_const);
     64   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::is_const);
    6565#endif
    6666};
    6767#ifndef BOOST_NO_RVALUE_REFERENCES
  • boost/type_traits/is_volatile.hpp

     
    4848#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
    4949   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<typename boost::remove_bounds<T>::type*>::is_volatile);
    5050#else
    51    BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<T*>::is_volatile);
     51   BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::is_volatile);
    5252#endif
    5353};
    5454#ifndef BOOST_NO_RVALUE_REFERENCES
  • boost/type_traits/remove_const.hpp

     
    4949struct remove_const_impl
    5050{
    5151    typedef typename remove_const_helper<
    52           typename cv_traits_imp<T*>::unqualified_type
     52          typename cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type
    5353        , ::boost::is_volatile<T>::value
    5454        >::type type;
    5555};
  • boost/type_traits/remove_cv.hpp

     
    3434template <class T>
    3535struct rvalue_ref_filter_rem_cv
    3636{
    37    typedef typename boost::detail::cv_traits_imp<T*>::unqualified_type type;
     37   typedef typename boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type type;
    3838};
    3939
    4040#ifndef BOOST_NO_RVALUE_REFERENCES
  • boost/type_traits/remove_volatile.hpp

     
    4848struct remove_volatile_impl
    4949{
    5050    typedef typename remove_volatile_helper<
    51           typename cv_traits_imp<T*>::unqualified_type
     51          typename cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type
    5252        , ::boost::is_const<T>::value
    5353        >::type type;
    5454};