blob: 5f1dd5e634d8a5ac2827524cf1b1357af140f667 [file] [log] [blame]
Jeff Thompsonf7d49942013-08-01 16:47:40 -07001
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
Jeff Thompson2277ce52013-08-01 17:34:11 -070014#include <ndnboost/config.hpp>
15#include <ndnboost/detail/workaround.hpp>
Jeff Thompsonf7d49942013-08-01 16:47:40 -070016
17#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
18
19// implementation helper:
20
21
22#if !(BOOST_WORKAROUND(__GNUC__,== 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 2))
23namespace ndnboost {
24namespace detail {
25#else
Jeff Thompson2277ce52013-08-01 17:34:11 -070026#include <ndnboost/type_traits/detail/yes_no_type.hpp>
Jeff Thompsonf7d49942013-08-01 16:47:40 -070027namespace ndnboost {
28namespace type_traits {
29namespace gcc8503 {
30#endif
31
32template <typename T> struct cv_traits_imp {};
33
34template <typename T>
35struct 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
42template <typename T>
43struct 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
50template <typename T>
51struct 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
58template <typename T>
59struct 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)
69yes_type mini_funcptr_tester(...);
70no_type mini_funcptr_tester(const volatile void*);
71
72} // namespace gcc8503
73} // namespace type_traits
74
75namespace detail {
76
77// Use the implementation above for non function pointers
78template <typename T, unsigned Select
79 = (unsigned)sizeof(::ndnboost::type_traits::gcc8503::mini_funcptr_tester((T)0)) >
80struct cv_traits_imp : public ::ndnboost::type_traits::gcc8503::cv_traits_imp<T> { };
81
82// Functions are never cv-qualified
83template <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 ndnboost
94
95#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
96
97#endif // BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED