17template <
class T,
class Deleter>
54template <
typename... Ts>
76template <
unsigned N,
unsigned... Is>
79template <
unsigned... Is>
84template <
typename Test,
template <
typename...>
class Ref>
87template <
template <
typename...>
class Ref,
typename... Args>
93template <
typename S,
typename T>
96template <
typename S,
typename T,
typename =
void>
99template <
typename S,
typename T>
109template <
typename T,
typename =
void>
119 decltype(std::declval<T>().find(std::declval<typename T::key_type>())),
120 decltype(std::declval<T>().insert(std::declval<typename T::value_type>()))>;
122template <
typename T,
typename =
void>
129#if ZEROERR_CXX_STANDARD >= 17
130#define ZEROERR_STRING_VIEW std::is_same<T, std::string_view>::value
132#define ZEROERR_STRING_VIEW 0
138 : std::integral_constant<bool, std::is_same<T, std::string>::value ||
139 std::is_same<T, const char*>::value || ZEROERR_STRING_VIEW> {
144template <
typename T,
typename =
void>
151template <
typename T,
typename =
void>
157 T().begin(), T().end(), T().size(),
162 T().insert(T().end(),
std::declval<typename T::value_type>()),
163 T().erase(T().begin()), (void)0)>> : std::true_type {};
171 decltype(std::declval<typename T::value_type>().second)>;
172template <
typename T,
typename =
void>
178template <
typename T,
typename V =
void>
194using is_not_array =
typename std::enable_if<!std::is_array<T>::value>::type;
211 template <
typename T,
typename F>
212 static void visit(T& tup,
size_t idx, F&& fun) {
214 fun(std::get<I - 1>(tup));
222 template <
typename T,
typename F>
223 static void visit(T&,
size_t, F&&) {}
226template <
typename F,
typename... Ts>
227void visit_at(
const std::tuple<Ts...>& tup,
size_t idx, F&& fun) {
228 visit_impl<
sizeof...(Ts)>::visit(tup, idx, std::forward<F>(fun));
231template <
typename F,
typename... Ts>
232void visit_at(std::tuple<Ts...>& tup,
size_t idx, F&& fun) {
233 visit_impl<
sizeof...(Ts)>::visit(tup, idx, std::forward<F>(fun));
239 template <
typename T1,
typename T2,
typename F>
240 static void visit(T1 tup1, T2 tup2,
size_t idx, F&& fun) {
242 fun(std::get<I - 1>(tup1), std::get<I - 1>(tup2));
250 template <
typename T1,
typename T2,
typename F>
251 static void visit(T1&, T2&,
size_t, F&&) {}
254template <
typename F,
typename... Ts,
typename... T2s>
255void visit2_at(
const std::tuple<Ts...>& tup1,
const std::tuple<T2s...>& tup2,
size_t idx, F&& fun) {
256 visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
259template <
typename F,
typename... Ts,
typename... T2s>
260void visit2_at(std::tuple<Ts...>& tup1, std::tuple<T2s...>& tup2,
size_t idx, F&& fun) {
261 visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
264template <
typename F,
typename... Ts,
typename... T2s>
265void visit2_at(
const std::tuple<Ts...>& tup1, std::tuple<T2s...>& tup2,
size_t idx, F&& fun) {
266 visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
269template <
typename F,
typename... Ts,
typename... T2s>
270void visit2_at(std::tuple<Ts...>& tup1,
const std::tuple<T2s...>& tup2,
size_t idx, F&& fun) {
271 visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
274#define ZEROERR_ENABLE_IF(x) \
275 template <typename T> \
276 typename std::enable_if<x, void>::type
277#define ZEROERR_IS_INT std::is_integral<T>::value
278#define ZEROERR_IS_FLOAT std::is_floating_point<T>::value
279#define ZEROERR_IS_CONTAINER detail::is_container<T>::value
280#define ZEROERR_IS_STRING detail::is_string<T>::value
281#define ZEROERR_IS_POINTER std::is_pointer<T>::value
282#define ZEROERR_IS_CHAR std::is_same<T, char>::value
283#define ZEROERR_IS_WCHAR std::is_same<T, wchar_t>::value
284#define ZEROERR_IS_CLASS std::is_class<T>::value
285#define ZEROERR_IS_STREAMABLE detail::is_streamable<std::ostream, T>::value
286#define ZEROERR_IS_ARRAY detail::is_array<T>::value
287#define ZEROERR_IS_COMPLEX detail::is_specialization<T, std::complex>::value
288#define ZEROERR_IS_BOOL std::is_same<T, bool>::value
289#define ZEROERR_IS_AUTOPTR \
290 (detail::is_specialization<T, std::unique_ptr>::value || \
291 detail::is_specialization<T, std::shared_ptr>::value || \
292 detail::is_specialization<T, std::weak_ptr>::value)
293#define ZEROERR_IS_MAP detail::ele_type_is_pair<T>::value
294#define ZEROERR_IS_POD std::is_standard_layout<T>::value
295#define ZEROERR_IS_EXT detail::has_extension<T>::value
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_POP
Definition config.h:265
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_PUSH
Definition config.h:218
void_t< typename T::value_type, decltype(std::declval< typename T::value_type >().first), decltype(std::declval< typename T::value_type >().second)> has_pair_type
Definition typetraits.h:171
typename to_store_type< T >::type to_store_type_t
Definition typetraits.h:206
void_t< decltype(std::declval< S & >()<< std::declval< T >())> has_stream_operator
Definition typetraits.h:94
void_t< decltype(std::declval< T >().begin()), decltype(std::declval< T >().end()), decltype(std::declval< T >().find(std::declval< typename T::key_type >())), decltype(std::declval< T >().insert(std::declval< typename T::value_type >()))> has_begin_end_find_insert
Definition typetraits.h:120
void_t< decltype(std::declval< T >().begin()), decltype(std::declval< T >().end())> has_begin_end
Definition typetraits.h:107
void void_t
Definition typetraits.h:55
typename std::enable_if<!std::is_array< T >::value >::type is_not_array
Definition typetraits.h:194
void visit_at(const std::tuple< Ts... > &tup, size_t idx, F &&fun)
Definition typetraits.h:227
void visit2_at(const std::tuple< Ts... > &tup1, const std::tuple< T2s... > &tup2, size_t idx, F &&fun)
Definition typetraits.h:255
Definition benchmark.cpp:17
Definition typetraits.h:61
static std::false_type value
Definition typetraits.h:62
Definition typetraits.h:66
static std::true_type value
Definition typetraits.h:67
Definition typetraits.h:173
Definition typetraits.h:77
Definition typetraits.h:145
Definition typetraits.h:123
Definition typetraits.h:110
Definition typetraits.h:152
Definition typetraits.h:85
Definition typetraits.h:97
Definition typetraits.h:139
Definition typetraits.h:74
T type
Definition typetraits.h:197
T type
Definition typetraits.h:202
std::string type
Definition typetraits.h:185
std::string type
Definition typetraits.h:190
Definition typetraits.h:179
T type
Definition typetraits.h:180
static void visit(T1 &, T2 &, size_t, F &&)
Definition typetraits.h:251
Definition typetraits.h:238
static void visit(T1 tup1, T2 tup2, size_t idx, F &&fun)
Definition typetraits.h:240
static void visit(T &, size_t, F &&)
Definition typetraits.h:223
Definition typetraits.h:210
static void visit(T &tup, size_t idx, F &&fun)
Definition typetraits.h:212
rank is a helper class for Printer to define the priority of overloaded functions.
Definition typetraits.h:46