| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_TEMPLATE_UTIL_H_ | 5 #ifndef BASE_TEMPLATE_UTIL_H_ |
| 6 #define BASE_TEMPLATE_UTIL_H_ | 6 #define BASE_TEMPLATE_UTIL_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <iosfwd> | 9 #include <iosfwd> |
| 10 #include <type_traits> | 10 #include <type_traits> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 __GLIBCXX__ == CR_GLIBCXX_4_6_4) | 22 __GLIBCXX__ == CR_GLIBCXX_4_6_4) |
| 23 #define CR_USE_FALLBACKS_FOR_OLD_GLIBCXX | 23 #define CR_USE_FALLBACKS_FOR_OLD_GLIBCXX |
| 24 #endif | 24 #endif |
| 25 | 25 |
| 26 namespace base { | 26 namespace base { |
| 27 | 27 |
| 28 template <class T> struct is_non_const_reference : std::false_type {}; | 28 template <class T> struct is_non_const_reference : std::false_type {}; |
| 29 template <class T> struct is_non_const_reference<T&> : std::true_type {}; | 29 template <class T> struct is_non_const_reference<T&> : std::true_type {}; |
| 30 template <class T> struct is_non_const_reference<const T&> : std::false_type {}; | 30 template <class T> struct is_non_const_reference<const T&> : std::false_type {}; |
| 31 | 31 |
| 32 // underlying_number |
| 33 // Casts an enum to its underlying integral type, leaves other numbers alone. |
| 34 // Useful for scoped enums, which don't cast implicitly. |
| 35 template <typename T, |
| 36 typename std::enable_if<std::is_enum<T>::value, int>::type = 0> |
| 37 constexpr typename std::underlying_type<T>::type underlying_number(T val) { |
| 38 return static_cast<typename std::underlying_type<T>::type>(val); |
| 39 } |
| 40 template <typename T, |
| 41 typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0> |
| 42 constexpr T underlying_number(T val) { |
| 43 return val; |
| 44 } |
| 45 |
| 32 // is_assignable | 46 // is_assignable |
| 33 | 47 |
| 34 namespace internal { | 48 namespace internal { |
| 35 | 49 |
| 36 template <typename First, typename Second> | 50 template <typename First, typename Second> |
| 37 struct SelectSecond { | 51 struct SelectSecond { |
| 38 using type = Second; | 52 using type = Second; |
| 39 }; | 53 }; |
| 40 | 54 |
| 41 struct Any { | 55 struct Any { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 #else | 138 #else |
| 125 template <class T> | 139 template <class T> |
| 126 using is_trivially_destructible = std::is_trivially_destructible<T>; | 140 using is_trivially_destructible = std::is_trivially_destructible<T>; |
| 127 #endif | 141 #endif |
| 128 | 142 |
| 129 } // namespace base | 143 } // namespace base |
| 130 | 144 |
| 131 #undef CR_USE_FALLBACKS_FOR_OLD_GLIBCXX | 145 #undef CR_USE_FALLBACKS_FOR_OLD_GLIBCXX |
| 132 | 146 |
| 133 #endif // BASE_TEMPLATE_UTIL_H_ | 147 #endif // BASE_TEMPLATE_UTIL_H_ |
| OLD | NEW |