blob: 7574e5bb05c07875ce37b08e7cbadd20f5be94c3 [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
Jeff Thompson3d613fd2013-10-15 15:39:04 -070011#ifndef NDNBOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
12#define NDNBOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
Jeff Thompsonf7d49942013-08-01 16:47:40 -070013
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
Jeff Thompson3d613fd2013-10-15 15:39:04 -070017#ifndef NDNBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Jeff Thompsonf7d49942013-08-01 16:47:40 -070018
19// implementation helper:
20
21
Jeff Thompson3d613fd2013-10-15 15:39:04 -070022#if !(NDNBOOST_WORKAROUND(__GNUC__,== 3) && NDNBOOST_WORKAROUND(__GNUC_MINOR__, <= 2))
Jeff Thompsonf7d49942013-08-01 16:47:40 -070023namespace 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{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070037 NDNBOOST_STATIC_CONSTANT(bool, is_const = false);
38 NDNBOOST_STATIC_CONSTANT(bool, is_volatile = false);
Jeff Thompsonf7d49942013-08-01 16:47:40 -070039 typedef T unqualified_type;
40};
41
42template <typename T>
43struct cv_traits_imp<const T*>
44{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070045 NDNBOOST_STATIC_CONSTANT(bool, is_const = true);
46 NDNBOOST_STATIC_CONSTANT(bool, is_volatile = false);
Jeff Thompsonf7d49942013-08-01 16:47:40 -070047 typedef T unqualified_type;
48};
49
50template <typename T>
51struct cv_traits_imp<volatile T*>
52{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070053 NDNBOOST_STATIC_CONSTANT(bool, is_const = false);
54 NDNBOOST_STATIC_CONSTANT(bool, is_volatile = true);
Jeff Thompsonf7d49942013-08-01 16:47:40 -070055 typedef T unqualified_type;
56};
57
58template <typename T>
59struct cv_traits_imp<const volatile T*>
60{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070061 NDNBOOST_STATIC_CONSTANT(bool, is_const = true);
62 NDNBOOST_STATIC_CONSTANT(bool, is_volatile = true);
Jeff Thompsonf7d49942013-08-01 16:47:40 -070063 typedef T unqualified_type;
64};
65
Jeff Thompson3d613fd2013-10-15 15:39:04 -070066#if NDNBOOST_WORKAROUND(__GNUC__,== 3) && NDNBOOST_WORKAROUND(__GNUC_MINOR__, <= 2)
Jeff Thompsonf7d49942013-08-01 16:47:40 -070067// 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{
Jeff Thompson3d613fd2013-10-15 15:39:04 -070085 NDNBOOST_STATIC_CONSTANT(bool, is_const = false);
86 NDNBOOST_STATIC_CONSTANT(bool, is_volatile = false);
Jeff Thompsonf7d49942013-08-01 16:47:40 -070087 typedef T unqualified_type;
88};
89
90#endif
91
92} // namespace detail
93} // namespace ndnboost
94
Jeff Thompson3d613fd2013-10-15 15:39:04 -070095#endif // NDNBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Jeff Thompsonf7d49942013-08-01 16:47:40 -070096
Jeff Thompson3d613fd2013-10-15 15:39:04 -070097#endif // NDNBOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED