Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(399)

Side by Side Diff: include/private/SkTLogic.h

Issue 1931003002: Remove skstd::is_convertible. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/core/SkRefCnt.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 * 6 *
7 * 7 *
8 * This header provides some of the helpers (like std::enable_if_t) which will 8 * This header provides some of the helpers (like std::enable_if_t) which will
9 * become available with C++14 in the type_traits header (in the skstd 9 * become available with C++14 in the type_traits header (in the skstd
10 * namespace). This header also provides several Skia specific additions such 10 * namespace). This header also provides several Skia specific additions such
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 __GLIBCXX__ == SK_GLIBCXX_4_5_4 || \ 76 __GLIBCXX__ == SK_GLIBCXX_4_5_4 || \
77 __GLIBCXX__ == SK_GLIBCXX_4_6_4) 77 __GLIBCXX__ == SK_GLIBCXX_4_6_4)
78 template <typename T> struct underlying_type { 78 template <typename T> struct underlying_type {
79 using type = __underlying_type(T); 79 using type = __underlying_type(T);
80 }; 80 };
81 #else 81 #else
82 template <typename T> using underlying_type = std::underlying_type<T>; 82 template <typename T> using underlying_type = std::underlying_type<T>;
83 #endif 83 #endif
84 template <typename T> using underlying_type_t = typename skstd::underlying_type< T>::type; 84 template <typename T> using underlying_type_t = typename skstd::underlying_type< T>::type;
85 85
86 template <typename S, typename D,
87 bool=std::is_void<S>::value || is_function<D>::value || std::is_array< D>::value>
88 struct is_convertible_detector {
89 static const/*expr*/ bool value = std::is_void<D>::value;
90 };
91 template <typename S, typename D> struct is_convertible_detector<S, D, false> {
92 using yes_type = uint8_t;
93 using no_type = uint16_t;
94
95 template <typename To> static void param_convertable_to(To);
96
97 template <typename From, typename To>
98 static decltype(param_convertable_to<To>(std::declval<From>()), yes_type()) convertible(int);
99
100 template <typename, typename> static no_type convertible(...);
101
102 static const/*expr*/ bool value = sizeof(convertible<S, D>(0)) == sizeof(yes _type);
103 };
104 // std::is_convertable is known to be broken (not work with incomplete types) in Android clang NDK.
105 // This is currently what prevents us from using std::unique_ptr.
106 template<typename S, typename D> struct is_convertible
107 : bool_constant<is_convertible_detector<S, D>::value> {};
108
109 } // namespace skstd 86 } // namespace skstd
110 87
111 // The sknonstd namespace contains things we would like to be proposed and feel std-ish. 88 // The sknonstd namespace contains things we would like to be proposed and feel std-ish.
112 namespace sknonstd { 89 namespace sknonstd {
113 90
114 // The name 'copy' here is fraught with peril. In this case it means 'append', n ot 'overwrite'. 91 // The name 'copy' here is fraught with peril. In this case it means 'append', n ot 'overwrite'.
115 // Alternate proposed names are 'propagate', 'augment', or 'append' (and 'add', but already taken). 92 // Alternate proposed names are 'propagate', 'augment', or 'append' (and 'add', but already taken).
116 // std::experimental::propagate_const already exists for other purposes in TSv2. 93 // std::experimental::propagate_const already exists for other purposes in TSv2.
117 // These also follow the <dest, source> pattern used by boost. 94 // These also follow the <dest, source> pattern used by boost.
118 template <typename D, typename S> struct copy_const { 95 template <typename D, typename S> struct copy_const {
(...skipping 20 matching lines...) Expand all
139 template <typename D, typename S> using same_volatile_t = typename same_volatile <D, S>::type; 116 template <typename D, typename S> using same_volatile_t = typename same_volatile <D, S>::type;
140 template <typename D, typename S> using same_cv = copy_cv<skstd::remove_cv_t<D>, S>; 117 template <typename D, typename S> using same_cv = copy_cv<skstd::remove_cv_t<D>, S>;
141 template <typename D, typename S> using same_cv_t = typename same_cv<D, S>::type ; 118 template <typename D, typename S> using same_cv_t = typename same_cv<D, S>::type ;
142 119
143 } // namespace sknonstd 120 } // namespace sknonstd
144 121
145 // Just a pithier wrapper for enable_if_t. 122 // Just a pithier wrapper for enable_if_t.
146 #define SK_WHEN(condition, T) skstd::enable_if_t<!!(condition), T> 123 #define SK_WHEN(condition, T) skstd::enable_if_t<!!(condition), T>
147 124
148 #endif 125 #endif
OLDNEW
« no previous file with comments | « include/core/SkRefCnt.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698