]> git.donarmstrong.com Git - rsem.git/blob - boost/type_traits/detail/cv_traits_impl.hpp
Updated boost to v1.55.0
[rsem.git] / boost / type_traits / detail / cv_traits_impl.hpp
1
2 //  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
3 //  Hinnant & John Maddock 2000.  
4 //  Use, modification and distribution are subject to the Boost Software License,
5 //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt).
7 //
8 //  See http://www.boost.org/libs/type_traits for most recent version including documentation.
9
10
11 #ifndef BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
12 #define BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
13
14 #include <boost/config.hpp>
15 #include <boost/detail/workaround.hpp>
16
17 #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
18
19 // implementation helper:
20
21
22 #if !(BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 2))
23 namespace boost {
24 namespace detail {
25 #else
26 #include <boost/type_traits/detail/yes_no_type.hpp>
27 namespace boost {
28 namespace type_traits {
29 namespace gcc8503 {
30 #endif
31
32 template <typename T> struct cv_traits_imp {};
33
34 template <typename T>
35 struct cv_traits_imp<T*>
36 {
37     BOOST_STATIC_CONSTANT(bool, is_const = false);
38     BOOST_STATIC_CONSTANT(bool, is_volatile = false);
39     typedef T unqualified_type;
40 };
41
42 template <typename T>
43 struct cv_traits_imp<const T*>
44 {
45     BOOST_STATIC_CONSTANT(bool, is_const = true);
46     BOOST_STATIC_CONSTANT(bool, is_volatile = false);
47     typedef T unqualified_type;
48 };
49
50 template <typename T>
51 struct cv_traits_imp<volatile T*>
52 {
53     BOOST_STATIC_CONSTANT(bool, is_const = false);
54     BOOST_STATIC_CONSTANT(bool, is_volatile = true);
55     typedef T unqualified_type;
56 };
57
58 template <typename T>
59 struct cv_traits_imp<const volatile T*>
60 {
61     BOOST_STATIC_CONSTANT(bool, is_const = true);
62     BOOST_STATIC_CONSTANT(bool, is_volatile = true);
63     typedef T unqualified_type;
64 };
65
66 #if BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 2)
67 // We have to exclude function pointers 
68 // (see http://gcc.gnu.org/bugzilla/show_bug.cgi?8503)
69 yes_type mini_funcptr_tester(...);
70 no_type  mini_funcptr_tester(const volatile void*);
71
72 } // namespace gcc8503
73 } // namespace type_traits
74
75 namespace detail {
76
77 // Use the implementation above for non function pointers
78 template <typename T, unsigned Select 
79   = (unsigned)sizeof(::boost::type_traits::gcc8503::mini_funcptr_tester((T)0)) >
80 struct cv_traits_imp : public ::boost::type_traits::gcc8503::cv_traits_imp<T> { };
81
82 // Functions are never cv-qualified
83 template <typename T> struct cv_traits_imp<T*,1>
84 {
85     BOOST_STATIC_CONSTANT(bool, is_const = false);
86     BOOST_STATIC_CONSTANT(bool, is_volatile = false);
87     typedef T unqualified_type;
88 };
89
90 #endif
91
92 } // namespace detail
93 } // namespace boost 
94
95 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
96
97 #endif // BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED