google_type_traits.h
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:8k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. // Copyright (c) 2006, Google Inc.
  2. // All rights reserved.
  3. //
  4. // Redistribution and use in source and binary forms, with or without
  5. // modification, are permitted provided that the following conditions are
  6. // met:
  7. //
  8. //     * Redistributions of source code must retain the above copyright
  9. // notice, this list of conditions and the following disclaimer.
  10. //     * Redistributions in binary form must reproduce the above
  11. // copyright notice, this list of conditions and the following disclaimer
  12. // in the documentation and/or other materials provided with the
  13. // distribution.
  14. //     * Neither the name of Google Inc. nor the names of its
  15. // contributors may be used to endorse or promote products derived from
  16. // this software without specific prior written permission.
  17. //
  18. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. // ----
  30. // Author: Matt Austern
  31. //
  32. // Define a small subset of tr1 type traits. The traits we define are:
  33. //   is_integral
  34. //   is_floating_point
  35. //   is_pointer
  36. //   is_pod
  37. //   has_trivial_copy
  38. //   has_trivial_assign
  39. // We can add more type traits as required.
  40. #ifndef BASE_TYPE_TRAITS_H__
  41. #define BASE_TYPE_TRAITS_H__
  42. #include "sparseconfig.h"
  43. #include <utility>                  // For pair
  44. _START_GOOGLE_NAMESPACE_
  45. // integral_constant, defined in tr1, is a wrapper for an integer
  46. // value. We don't really need this generality; we could get away
  47. // with hardcoding the integer type to bool. We use the fully
  48. // general integer_constant for compatibility with tr1.
  49. template<class T, T v>
  50. struct integral_constant {
  51.   static const T value = v;
  52.   typedef T value_type;
  53.   typedef integral_constant<T, v> type;
  54. };
  55. template <class T, T v> const T integral_constant<T, v>::value;
  56. // Abbreviations: true_type and false_type are structs that represent
  57. // boolean true and false values.
  58. typedef integral_constant<bool, true>  true_type;
  59. typedef integral_constant<bool, false> false_type;
  60. // is_integral is false except for the built-in integer types.
  61. template <class T> struct is_integral : false_type { };
  62. template<> struct is_integral<bool> : true_type { };
  63. template<> struct is_integral<char> : true_type { };
  64. template<> struct is_integral<unsigned char> : true_type { };
  65. template<> struct is_integral<signed char> : true_type { };
  66. #if defined(_MSC_VER)
  67. // wchar_t is not by default a distinct type from unsigned short in
  68. // Microsoft C.
  69. // See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx
  70. template<> struct is_integral<__wchar_t> : true_type { };
  71. #else
  72. template<> struct is_integral<wchar_t> : true_type { };
  73. #endif
  74. template<> struct is_integral<short> : true_type { };
  75. template<> struct is_integral<unsigned short> : true_type { };
  76. template<> struct is_integral<int> : true_type { };
  77. template<> struct is_integral<unsigned int> : true_type { };
  78. template<> struct is_integral<long> : true_type { };
  79. template<> struct is_integral<unsigned long> : true_type { };
  80. #ifdef HAVE_LONG_LONG
  81. template<> struct is_integral<long long> : true_type { };
  82. template<> struct is_integral<unsigned long long> : true_type { };
  83. #endif
  84. // is_floating_point is false except for the built-in floating-point types.
  85. template <class T> struct is_floating_point : false_type { };
  86. template<> struct is_floating_point<float> : true_type { };
  87. template<> struct is_floating_point<double> : true_type { };
  88. template<> struct is_floating_point<long double> : true_type { };
  89. // is_pointer is false except for pointer types.
  90. template <class T> struct is_pointer : false_type { };
  91. template <class T> struct is_pointer<T*> : true_type { };
  92. // We can't get is_pod right without compiler help, so fail conservatively.
  93. // We will assume it's false except for arithmetic types and pointers,
  94. // and const versions thereof. Note that std::pair is not a POD.
  95. template <class T> struct is_pod
  96.  : integral_constant<bool, (is_integral<T>::value ||
  97.                             is_floating_point<T>::value ||
  98.                             is_pointer<T>::value)> { };
  99. template <class T> struct is_pod<const T> : is_pod<T> { };
  100. // We can't get has_trivial_constructor right without compiler help, so
  101. // fail conservatively. We will assume it's false except for: (1) types
  102. // for which is_pod is true. (2) std::pair of types with trivial
  103. // constructors. (3) array of a type with a trivial constructor.
  104. // (4) const versions thereof.
  105. template <class T> struct has_trivial_constructor : is_pod<T> { };
  106. template <class T, class U> struct has_trivial_constructor<std::pair<T, U> >
  107.   : integral_constant<bool,
  108.                       (has_trivial_constructor<T>::value &&
  109.                        has_trivial_constructor<U>::value)> { };
  110. template <class A, int N> struct has_trivial_constructor<A[N]>
  111.   : has_trivial_constructor<A> { };
  112. template <class T> struct has_trivial_constructor<const T>
  113.   : has_trivial_constructor<T> { };
  114. // We can't get has_trivial_copy right without compiler help, so fail
  115. // conservatively. We will assume it's false except for: (1) types
  116. // for which is_pod is true. (2) std::pair of types with trivial copy
  117. // constructors. (3) array of a type with a trivial copy constructor.
  118. // (4) const versions thereof.
  119. template <class T> struct has_trivial_copy : is_pod<T> { };
  120. template <class T, class U> struct has_trivial_copy<std::pair<T, U> >
  121.   : integral_constant<bool,
  122.                       (has_trivial_copy<T>::value &&
  123.                        has_trivial_copy<U>::value)> { };
  124. template <class A, int N> struct has_trivial_copy<A[N]>
  125.   : has_trivial_copy<A> { };
  126. template <class T> struct has_trivial_copy<const T> : has_trivial_copy<T> { };
  127. // We can't get has_trivial_assign right without compiler help, so fail
  128. // conservatively. We will assume it's false except for: (1) types
  129. // for which is_pod is true. (2) std::pair of types with trivial copy
  130. // constructors. (3) array of a type with a trivial assign constructor.
  131. template <class T> struct has_trivial_assign : is_pod<T> { };
  132. template <class T, class U> struct has_trivial_assign<std::pair<T, U> >
  133.   : integral_constant<bool,
  134.                       (has_trivial_assign<T>::value &&
  135.                        has_trivial_assign<U>::value)> { };
  136. template <class A, int N> struct has_trivial_assign<A[N]>
  137.   : has_trivial_assign<A> { };
  138. // We can't get has_trivial_destructor right without compiler help, so
  139. // fail conservatively. We will assume it's false except for: (1) types
  140. // for which is_pod is true. (2) std::pair of types with trivial
  141. // destructors. (3) array of a type with a trivial destructor.
  142. // (4) const versions thereof.
  143. template <class T> struct has_trivial_destructor : is_pod<T> { };
  144. template <class T, class U> struct has_trivial_destructor<std::pair<T, U> >
  145.   : integral_constant<bool,
  146.                       (has_trivial_destructor<T>::value &&
  147.                        has_trivial_destructor<U>::value)> { };
  148. template <class A, int N> struct has_trivial_destructor<A[N]>
  149.   : has_trivial_destructor<A> { };
  150. template <class T> struct has_trivial_destructor<const T>
  151.   : has_trivial_destructor<T> { };
  152. // Specified by TR1 [4.7.1]
  153. template<typename T> struct remove_const { typedef T type; };
  154. template<typename T> struct remove_const<T const> { typedef T type; };
  155. // Specified by TR1 [4.7.2]
  156. template<typename T> struct remove_reference { typedef T type; };
  157. template<typename T> struct remove_reference<T&> { typedef T type; };
  158. // Specified by TR1 [4.7.4] Pointer modifications.
  159. template<typename T> struct remove_pointer { typedef T type; };
  160. template<typename T> struct remove_pointer<T*> { typedef T type; };
  161. template<typename T> struct remove_pointer<T* const> { typedef T type; };
  162. template<typename T> struct remove_pointer<T* volatile> { typedef T type; };
  163. template<typename T> struct remove_pointer<T* const volatile> {
  164.   typedef T type; };
  165. _END_GOOGLE_NAMESPACE_
  166. #endif  // BASE_TYPE_TRAITS_H__