16 #define QX_CHAR_T_CHAR 0
17 #define QX_CHAR_T_WCHAR_T 1
20 #define QX_CONF_CHAR QX_CHAR_T_WCHAR_T
24 #define QX_FMT_LIB_FMT 0
25 #define QX_FMT_LIB_STD 1
27 #ifndef QX_CONF_FMT_LIB
28 #if __has_include("fmt/format.h")
29 #define QX_CONF_FMT_LIB QX_FMT_LIB_FMT
31 #define QX_CONF_FMT_LIB QX_FMT_LIB_STD
36 #define QX_ALL_CHAR_TYPES char, wchar_t
41 using all_char_types = std::tuple<QX_ALL_CHAR_TYPES>;
46 #if QX_CONF_CHAR == QX_CHAR_T_CHAR
47 #define QX_CHAR_TYPE char
48 #define _QXT(quote) quote
49 #elif QX_CONF_CHAR == QX_CHAR_T_WCHAR_T
50 #define QX_CHAR_TYPE wchar_t
51 #define _QXT(quote) L##quote
53 #if !defined(QX_CONF_UNICODE_MACRO)
54 #define QX_CONF_UNICODE_MACRO 1
57 #if QX_CONF_UNICODE_MACRO && QX_WIN
61 #error Unsupported char type
64 #define QXT(quote) _QXT(quote)
69 using char_type = QX_CHAR_TYPE;
70 using forbidden_char_types = tuple_utils::remove_t<details::all_char_types, std::tuple<char_type>>;
74 #if QX_CONF_FMT_LIB == QX_FMT_LIB_FMT
75 QX_PUSH_SUPPRESS_ALL_WARNINGS();
77 #define FMT_HEADER_ONLY 1
78 #include "fmt/format.h"
79 #include "fmt/xchar.h"
80 QX_POP_SUPPRESS_WARNINGS();
82 #define _QX_FMT_DISABLE_RANGE_FORMATTING(T) \
83 template<class char_t> \
84 struct fmt::range_format_kind<T, char_t> \
85 : std::integral_constant<fmt::range_format, fmt::range_format::disabled> \
88 #define _QX_FMT_DISABLE_TUPLE_FORMATTING(T) \
89 template<class char_t> \
90 struct fmt::is_tuple_formattable<T, char_t> : std::false_type \
93 #elif QX_CONF_FMT_LIB == QX_FMT_LIB_STD
96 #define _QX_FMT_DISABLE_RANGE_FORMATTING(T) \
98 inline constexpr std::range_format std::format_kind<T> = std::range_format::disabled
99 #define _QX_FMT_DISABLE_TUPLE_FORMATTING(T)
101 #error No fmt lib selected
110 #define QX_FMT_DISABLE_RANGE_FORMATTING(T) _QX_FMT_DISABLE_RANGE_FORMATTING(T)
118 #define QX_FMT_DISABLE_TUPLE_FORMATTING(T) _QX_FMT_DISABLE_TUPLE_FORMATTING(T)
Contains utils for working with std::tuple.