1 ////////////////////////////////////////////////////////////////////////////// 2 // (C) Copyright John Maddock 2000. 3 // (C) Copyright Ion Gaztanaga 2005-2012. 4 // 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 // See http://www.boost.org/libs/interprocess for documentation. 10 // 11 ////////////////////////////////////////////////////////////////////////////// 12 13 #ifndef BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP 14 #define BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP 15 16 #ifndef BOOST_CONFIG_HPP 17 # include <boost/config.hpp> 18 #endif 19 # 20 #if defined(BOOST_HAS_PRAGMA_ONCE) 21 # pragma once 22 #endif 23 24 #include <boost/interprocess/detail/config_begin.hpp> 25 26 namespace boost { 27 namespace interprocess { 28 namespace ipcdetail { 29 30 struct nat{}; 31 32 template<class T> 33 struct remove_reference 34 { 35 typedef T type; 36 }; 37 38 template<class T> 39 struct remove_reference<T&> 40 { 41 typedef T type; 42 }; 43 44 template<class T> 45 struct is_reference 46 { 47 static const bool value = false; 48 }; 49 50 template<class T> 51 struct is_reference<T&> 52 { 53 static const bool value = true; 54 }; 55 56 template<class T> 57 struct is_pointer 58 { 59 static const bool value = false; 60 }; 61 62 template<class T> 63 struct is_pointer<T*> 64 { 65 static const bool value = true; 66 }; 67 68 template <typename T> 69 struct add_reference 70 { 71 typedef T& type; 72 }; 73 74 template<class T> 75 struct add_reference<T&> 76 { 77 typedef T& type; 78 }; 79 80 template<> 81 struct add_reference<void> 82 { 83 typedef nat &type; 84 }; 85 86 template<> 87 struct add_reference<const void> 88 { 89 typedef const nat &type; 90 }; 91 92 template <class T> 93 struct add_const_reference 94 { typedef const T &type; }; 95 96 template <class T> 97 struct add_const_reference<T&> 98 { typedef T& type; }; 99 100 template<class T> 101 struct remove_const 102 { 103 typedef T type; 104 }; 105 106 template<class T> 107 struct remove_const<const T> 108 { 109 typedef T type; 110 }; 111 112 template<class T> 113 struct remove_volatile 114 { 115 typedef T type; 116 }; 117 118 template<class T> 119 struct remove_volatile<volatile T> 120 { 121 typedef T type; 122 }; 123 124 template<class T> 125 struct remove_const_volatile 126 { 127 typedef typename remove_const<typename remove_volatile<T>::type>::type type; 128 }; 129 130 template <typename T, typename U> 131 struct is_same 132 { 133 typedef char yes_type; 134 struct no_type 135 { 136 char padding[8]; 137 }; 138 139 template <typename V> 140 static yes_type is_same_tester(V*, V*); 141 static no_type is_same_tester(...); 142 143 static T *t; 144 static U *u; 145 146 static const bool value = sizeof(yes_type) == sizeof(is_same_tester(t,u)); 147 }; 148 149 template<class T, class U> 150 struct is_cv_same 151 { 152 static const bool value = is_same< typename remove_const_volatile<T>::type 153 , typename remove_const_volatile<U>::type >::value; 154 }; 155 156 } // namespace ipcdetail 157 } //namespace interprocess { 158 } //namespace boost { 159 160 #include <boost/interprocess/detail/config_end.hpp> 161 162 #endif //#ifndef BOOST_INTERPROCESS_DETAIL_TYPE_TRAITS_HPP 163