40template <
typename... Ts>
 
   62template <
unsigned N, 
unsigned... Is>
 
   65template <
unsigned... Is>
 
   70template <
typename Test, 
template <
typename...> 
class Ref>
 
   73template <
template <
typename...> 
class Ref, 
typename... Args>
 
   79template <
typename S, 
typename T>
 
   82template <
typename S, 
typename T, 
typename = 
void>
 
   85template <
typename S, 
typename T>
 
   95template <
typename T, 
typename = 
void>
 
  105           decltype(std::declval<T>().find(std::declval<typename T::key_type>())),
 
  106           decltype(std::declval<T>().insert(std::declval<typename T::value_type>()))>;
 
  108template <
typename T, 
typename = 
void>
 
  115#if ZEROERR_CXX_STANDARD >= 17 
  116#define ZEROERR_STRING_VIEW std::is_same<T, std::string_view>::value 
  118#define ZEROERR_STRING_VIEW 0 
  124    : std::integral_constant<bool, std::is_same<T, std::string>::value ||
 
  125                                       std::is_same<T, const char*>::value || ZEROERR_STRING_VIEW> {
 
 
  130template <
typename T, 
typename = 
void>
 
  137template <
typename T, 
typename = 
void>
 
  143                                T().begin(), T().end(), T().size(),
 
  148                                T().insert(T().end(), std::declval<typename T::value_type>()),
 
  149                                T().erase(T().begin()), (void)0)>> : std::true_type {};
 
 
  157           decltype(std::declval<typename T::value_type>().second)>;
 
  158template <
typename T, 
typename = 
void>
 
  164template <
typename T, 
typename V = 
void>
 
  180using is_not_array = 
typename std::enable_if<!std::is_array<T>::value>::type;
 
  197    template <
typename T, 
typename F>
 
  198    static void visit(T& tup, 
size_t idx, F&& fun) {
 
  200            fun(std::get<I - 1>(tup));
 
 
 
  208    template <
typename T, 
typename F>
 
  209    static void visit(T&, 
size_t, F&&) {}
 
 
  212template <
typename F, 
typename... Ts>
 
  213void visit_at(
const std::tuple<Ts...>& tup, 
size_t idx, F&& fun) {
 
  214    visit_impl<
sizeof...(Ts)>::visit(tup, idx, std::forward<F>(fun));
 
 
  217template <
typename F, 
typename... Ts>
 
  218void visit_at(std::tuple<Ts...>& tup, 
size_t idx, F&& fun) {
 
  219    visit_impl<
sizeof...(Ts)>::visit(tup, idx, std::forward<F>(fun));
 
 
  225    template <
typename T1, 
typename T2, 
typename F>
 
  226    static void visit(T1 tup1, T2 tup2, 
size_t idx, F&& fun) {
 
  228            fun(std::get<I - 1>(tup1), std::get<I - 1>(tup2));
 
 
 
  236    template <
typename T1, 
typename T2, 
typename F>
 
  237    static void visit(T1&, T2&, 
size_t, F&&) {}
 
 
  240template <
typename F, 
typename... Ts, 
typename... T2s>
 
  241void visit2_at(
const std::tuple<Ts...>& tup1, 
const std::tuple<T2s...>& tup2, 
size_t idx, F&& fun) {
 
  242    visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
 
 
  245template <
typename F, 
typename... Ts, 
typename... T2s>
 
  246void visit2_at(std::tuple<Ts...>& tup1, std::tuple<T2s...>& tup2, 
size_t idx, F&& fun) {
 
  247    visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
 
 
  250template <
typename F, 
typename... Ts, 
typename... T2s>
 
  251void visit2_at(
const std::tuple<Ts...>& tup1, std::tuple<T2s...>& tup2, 
size_t idx, F&& fun) {
 
  252    visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
 
 
  255template <
typename F, 
typename... Ts, 
typename... T2s>
 
  256void visit2_at(std::tuple<Ts...>& tup1, 
const std::tuple<T2s...>& tup2, 
size_t idx, F&& fun) {
 
  257    visit2_impl<
sizeof...(Ts)>::visit(tup1, tup2, idx, std::forward<F>(fun));
 
 
  260#define ZEROERR_ENABLE_IF(x) \ 
  261    template <typename T>    \ 
  262    typename std::enable_if<x, void>::type 
 
  263#define ZEROERR_IS_INT        std::is_integral<T>::value 
  264#define ZEROERR_IS_FLOAT      std::is_floating_point<T>::value 
  265#define ZEROERR_IS_CONTAINER  detail::is_container<T>::value 
  266#define ZEROERR_IS_STRING     detail::is_string<T>::value 
  267#define ZEROERR_IS_POINTER    std::is_pointer<T>::value 
  268#define ZEROERR_IS_CHAR       std::is_same<T, char>::value 
  269#define ZEROERR_IS_WCHAR      std::is_same<T, wchar_t>::value 
  270#define ZEROERR_IS_CLASS      std::is_class<T>::value 
  271#define ZEROERR_IS_STREAMABLE detail::is_streamable<std::ostream, T>::value 
  272#define ZEROERR_IS_ARRAY      detail::is_array<T>::value 
  273#define ZEROERR_IS_COMPLEX    detail::is_specialization<T, std::complex>::value 
  274#define ZEROERR_IS_BOOL       std::is_same<T, bool>::value 
  275#define ZEROERR_IS_AUTOPTR                                   \ 
  276    (detail::is_specialization<T, std::unique_ptr>::value || \ 
  277     detail::is_specialization<T, std::shared_ptr>::value || \ 
  278     detail::is_specialization<T, std::weak_ptr>::value) 
 
  279#define ZEROERR_IS_MAP detail::ele_type_is_pair<T>::value 
  280#define ZEROERR_IS_POD std::is_standard_layout<T>::value 
  281#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:157
typename to_store_type< T >::type to_store_type_t
Definition typetraits.h:192
void_t< decltype(std::declval< S & >()<< std::declval< T >())> has_stream_operator
Definition typetraits.h:80
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:106
void_t< decltype(std::declval< T >().begin()), decltype(std::declval< T >().end())> has_begin_end
Definition typetraits.h:93
void void_t
Definition typetraits.h:41
typename std::enable_if<!std::is_array< T >::value >::type is_not_array
Definition typetraits.h:180
void visit_at(const std::tuple< Ts... > &tup, size_t idx, F &&fun)
Definition typetraits.h:213
void visit2_at(const std::tuple< Ts... > &tup1, const std::tuple< T2s... > &tup2, size_t idx, F &&fun)
Definition typetraits.h:241
Definition benchmark.cpp:17
Definition typetraits.h:47
static std::false_type value
Definition typetraits.h:48
Definition typetraits.h:52
static std::true_type value
Definition typetraits.h:53
Definition typetraits.h:159
Definition typetraits.h:63
Definition typetraits.h:131
Definition typetraits.h:109
Definition typetraits.h:96
Definition typetraits.h:138
Definition typetraits.h:71
Definition typetraits.h:83
Definition typetraits.h:125
Definition typetraits.h:60
T type
Definition typetraits.h:183
T type
Definition typetraits.h:188
std::string type
Definition typetraits.h:171
std::string type
Definition typetraits.h:176
Definition typetraits.h:165
T type
Definition typetraits.h:166
static void visit(T1 &, T2 &, size_t, F &&)
Definition typetraits.h:237
Definition typetraits.h:224
static void visit(T1 tup1, T2 tup2, size_t idx, F &&fun)
Definition typetraits.h:226
static void visit(T &, size_t, F &&)
Definition typetraits.h:209
Definition typetraits.h:196
static void visit(T &tup, size_t idx, F &&fun)
Definition typetraits.h:198
rank is a helper class for Printer to define the priority of overloaded functions.
Definition typetraits.h:32