qupled 1.3.2__cp311-cp311-macosx_14_0_arm64.whl → 1.3.3__cp311-cp311-macosx_14_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qupled/include/fmt/args.h +235 -0
- qupled/include/fmt/chrono.h +2240 -0
- qupled/include/fmt/color.h +643 -0
- qupled/include/fmt/compile.h +535 -0
- qupled/include/fmt/core.h +2969 -0
- qupled/include/fmt/format-inl.h +1678 -0
- qupled/include/fmt/format.h +4535 -0
- qupled/include/fmt/os.h +455 -0
- qupled/include/fmt/ostream.h +245 -0
- qupled/include/fmt/printf.h +675 -0
- qupled/include/fmt/ranges.h +738 -0
- qupled/include/fmt/std.h +537 -0
- qupled/include/fmt/xchar.h +259 -0
- qupled/lib/cmake/fmt/fmt-config-version.cmake +43 -0
- qupled/lib/cmake/fmt/fmt-config.cmake +31 -0
- qupled/lib/cmake/fmt/fmt-targets-release.cmake +19 -0
- qupled/lib/cmake/fmt/fmt-targets.cmake +116 -0
- qupled/lib/libfmt.a +0 -0
- qupled/lib/pkgconfig/fmt.pc +11 -0
- qupled/native.cpython-311-darwin.so +0 -0
- {qupled-1.3.2.dist-info → qupled-1.3.3.dist-info}/METADATA +1 -1
- qupled-1.3.3.dist-info/RECORD +43 -0
- qupled-1.3.2.dist-info/RECORD +0 -24
- {qupled-1.3.2.dist-info → qupled-1.3.3.dist-info}/WHEEL +0 -0
- {qupled-1.3.2.dist-info → qupled-1.3.3.dist-info}/licenses/LICENSE +0 -0
- {qupled-1.3.2.dist-info → qupled-1.3.3.dist-info}/top_level.txt +0 -0
qupled/include/fmt/std.h
ADDED
@@ -0,0 +1,537 @@
|
|
1
|
+
// Formatting library for C++ - formatters for standard library types
|
2
|
+
//
|
3
|
+
// Copyright (c) 2012 - present, Victor Zverovich
|
4
|
+
// All rights reserved.
|
5
|
+
//
|
6
|
+
// For the license information refer to format.h.
|
7
|
+
|
8
|
+
#ifndef FMT_STD_H_
|
9
|
+
#define FMT_STD_H_
|
10
|
+
|
11
|
+
#include <atomic>
|
12
|
+
#include <bitset>
|
13
|
+
#include <cstdlib>
|
14
|
+
#include <exception>
|
15
|
+
#include <memory>
|
16
|
+
#include <thread>
|
17
|
+
#include <type_traits>
|
18
|
+
#include <typeinfo>
|
19
|
+
#include <utility>
|
20
|
+
#include <vector>
|
21
|
+
|
22
|
+
#include "format.h"
|
23
|
+
#include "ostream.h"
|
24
|
+
|
25
|
+
#if FMT_HAS_INCLUDE(<version>)
|
26
|
+
# include <version>
|
27
|
+
#endif
|
28
|
+
// Checking FMT_CPLUSPLUS for warning suppression in MSVC.
|
29
|
+
#if FMT_CPLUSPLUS >= 201703L
|
30
|
+
# if FMT_HAS_INCLUDE(<filesystem>)
|
31
|
+
# include <filesystem>
|
32
|
+
# endif
|
33
|
+
# if FMT_HAS_INCLUDE(<variant>)
|
34
|
+
# include <variant>
|
35
|
+
# endif
|
36
|
+
# if FMT_HAS_INCLUDE(<optional>)
|
37
|
+
# include <optional>
|
38
|
+
# endif
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#if FMT_CPLUSPLUS > 201703L && FMT_HAS_INCLUDE(<source_location>)
|
42
|
+
# include <source_location>
|
43
|
+
#endif
|
44
|
+
|
45
|
+
// GCC 4 does not support FMT_HAS_INCLUDE.
|
46
|
+
#if FMT_HAS_INCLUDE(<cxxabi.h>) || defined(__GLIBCXX__)
|
47
|
+
# include <cxxabi.h>
|
48
|
+
// Android NDK with gabi++ library on some architectures does not implement
|
49
|
+
// abi::__cxa_demangle().
|
50
|
+
# ifndef __GABIXX_CXXABI_H__
|
51
|
+
# define FMT_HAS_ABI_CXA_DEMANGLE
|
52
|
+
# endif
|
53
|
+
#endif
|
54
|
+
|
55
|
+
// Check if typeid is available.
|
56
|
+
#ifndef FMT_USE_TYPEID
|
57
|
+
// __RTTI is for EDG compilers. In MSVC typeid is available without RTTI.
|
58
|
+
# if defined(__GXX_RTTI) || FMT_HAS_FEATURE(cxx_rtti) || FMT_MSC_VERSION || \
|
59
|
+
defined(__INTEL_RTTI__) || defined(__RTTI)
|
60
|
+
# define FMT_USE_TYPEID 1
|
61
|
+
# else
|
62
|
+
# define FMT_USE_TYPEID 0
|
63
|
+
# endif
|
64
|
+
#endif
|
65
|
+
|
66
|
+
// For older Xcode versions, __cpp_lib_xxx flags are inaccurately defined.
|
67
|
+
#ifndef FMT_CPP_LIB_FILESYSTEM
|
68
|
+
# ifdef __cpp_lib_filesystem
|
69
|
+
# define FMT_CPP_LIB_FILESYSTEM __cpp_lib_filesystem
|
70
|
+
# else
|
71
|
+
# define FMT_CPP_LIB_FILESYSTEM 0
|
72
|
+
# endif
|
73
|
+
#endif
|
74
|
+
|
75
|
+
#ifndef FMT_CPP_LIB_VARIANT
|
76
|
+
# ifdef __cpp_lib_variant
|
77
|
+
# define FMT_CPP_LIB_VARIANT __cpp_lib_variant
|
78
|
+
# else
|
79
|
+
# define FMT_CPP_LIB_VARIANT 0
|
80
|
+
# endif
|
81
|
+
#endif
|
82
|
+
|
83
|
+
#if FMT_CPP_LIB_FILESYSTEM
|
84
|
+
FMT_BEGIN_NAMESPACE
|
85
|
+
|
86
|
+
namespace detail {
|
87
|
+
|
88
|
+
template <typename Char, typename PathChar>
|
89
|
+
auto get_path_string(const std::filesystem::path& p,
|
90
|
+
const std::basic_string<PathChar>& native) {
|
91
|
+
if constexpr (std::is_same_v<Char, char> && std::is_same_v<PathChar, wchar_t>)
|
92
|
+
return to_utf8<wchar_t>(native, to_utf8_error_policy::replace);
|
93
|
+
else
|
94
|
+
return p.string<Char>();
|
95
|
+
}
|
96
|
+
|
97
|
+
template <typename Char, typename PathChar>
|
98
|
+
void write_escaped_path(basic_memory_buffer<Char>& quoted,
|
99
|
+
const std::filesystem::path& p,
|
100
|
+
const std::basic_string<PathChar>& native) {
|
101
|
+
if constexpr (std::is_same_v<Char, char> &&
|
102
|
+
std::is_same_v<PathChar, wchar_t>) {
|
103
|
+
auto buf = basic_memory_buffer<wchar_t>();
|
104
|
+
write_escaped_string<wchar_t>(std::back_inserter(buf), native);
|
105
|
+
bool valid = to_utf8<wchar_t>::convert(quoted, {buf.data(), buf.size()});
|
106
|
+
FMT_ASSERT(valid, "invalid utf16");
|
107
|
+
} else if constexpr (std::is_same_v<Char, PathChar>) {
|
108
|
+
write_escaped_string<std::filesystem::path::value_type>(
|
109
|
+
std::back_inserter(quoted), native);
|
110
|
+
} else {
|
111
|
+
write_escaped_string<Char>(std::back_inserter(quoted), p.string<Char>());
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
} // namespace detail
|
116
|
+
|
117
|
+
FMT_EXPORT
|
118
|
+
template <typename Char> struct formatter<std::filesystem::path, Char> {
|
119
|
+
private:
|
120
|
+
format_specs<Char> specs_;
|
121
|
+
detail::arg_ref<Char> width_ref_;
|
122
|
+
bool debug_ = false;
|
123
|
+
char path_type_ = 0;
|
124
|
+
|
125
|
+
public:
|
126
|
+
FMT_CONSTEXPR void set_debug_format(bool set = true) { debug_ = set; }
|
127
|
+
|
128
|
+
template <typename ParseContext> FMT_CONSTEXPR auto parse(ParseContext& ctx) {
|
129
|
+
auto it = ctx.begin(), end = ctx.end();
|
130
|
+
if (it == end) return it;
|
131
|
+
|
132
|
+
it = detail::parse_align(it, end, specs_);
|
133
|
+
if (it == end) return it;
|
134
|
+
|
135
|
+
it = detail::parse_dynamic_spec(it, end, specs_.width, width_ref_, ctx);
|
136
|
+
if (it != end && *it == '?') {
|
137
|
+
debug_ = true;
|
138
|
+
++it;
|
139
|
+
}
|
140
|
+
if (it != end && (*it == 'g')) path_type_ = *it++;
|
141
|
+
return it;
|
142
|
+
}
|
143
|
+
|
144
|
+
template <typename FormatContext>
|
145
|
+
auto format(const std::filesystem::path& p, FormatContext& ctx) const {
|
146
|
+
auto specs = specs_;
|
147
|
+
# ifdef _WIN32
|
148
|
+
auto path_string = !path_type_ ? p.native() : p.generic_wstring();
|
149
|
+
# else
|
150
|
+
auto path_string = !path_type_ ? p.native() : p.generic_string();
|
151
|
+
# endif
|
152
|
+
|
153
|
+
detail::handle_dynamic_spec<detail::width_checker>(specs.width, width_ref_,
|
154
|
+
ctx);
|
155
|
+
if (!debug_) {
|
156
|
+
auto s = detail::get_path_string<Char>(p, path_string);
|
157
|
+
return detail::write(ctx.out(), basic_string_view<Char>(s), specs);
|
158
|
+
}
|
159
|
+
auto quoted = basic_memory_buffer<Char>();
|
160
|
+
detail::write_escaped_path(quoted, p, path_string);
|
161
|
+
return detail::write(ctx.out(),
|
162
|
+
basic_string_view<Char>(quoted.data(), quoted.size()),
|
163
|
+
specs);
|
164
|
+
}
|
165
|
+
};
|
166
|
+
FMT_END_NAMESPACE
|
167
|
+
#endif // FMT_CPP_LIB_FILESYSTEM
|
168
|
+
|
169
|
+
FMT_BEGIN_NAMESPACE
|
170
|
+
FMT_EXPORT
|
171
|
+
template <std::size_t N, typename Char>
|
172
|
+
struct formatter<std::bitset<N>, Char> : nested_formatter<string_view> {
|
173
|
+
private:
|
174
|
+
// Functor because C++11 doesn't support generic lambdas.
|
175
|
+
struct writer {
|
176
|
+
const std::bitset<N>& bs;
|
177
|
+
|
178
|
+
template <typename OutputIt>
|
179
|
+
FMT_CONSTEXPR auto operator()(OutputIt out) -> OutputIt {
|
180
|
+
for (auto pos = N; pos > 0; --pos) {
|
181
|
+
out = detail::write<Char>(out, bs[pos - 1] ? Char('1') : Char('0'));
|
182
|
+
}
|
183
|
+
|
184
|
+
return out;
|
185
|
+
}
|
186
|
+
};
|
187
|
+
|
188
|
+
public:
|
189
|
+
template <typename FormatContext>
|
190
|
+
auto format(const std::bitset<N>& bs, FormatContext& ctx) const
|
191
|
+
-> decltype(ctx.out()) {
|
192
|
+
return write_padded(ctx, writer{bs});
|
193
|
+
}
|
194
|
+
};
|
195
|
+
|
196
|
+
FMT_EXPORT
|
197
|
+
template <typename Char>
|
198
|
+
struct formatter<std::thread::id, Char> : basic_ostream_formatter<Char> {};
|
199
|
+
FMT_END_NAMESPACE
|
200
|
+
|
201
|
+
#ifdef __cpp_lib_optional
|
202
|
+
FMT_BEGIN_NAMESPACE
|
203
|
+
FMT_EXPORT
|
204
|
+
template <typename T, typename Char>
|
205
|
+
struct formatter<std::optional<T>, Char,
|
206
|
+
std::enable_if_t<is_formattable<T, Char>::value>> {
|
207
|
+
private:
|
208
|
+
formatter<T, Char> underlying_;
|
209
|
+
static constexpr basic_string_view<Char> optional =
|
210
|
+
detail::string_literal<Char, 'o', 'p', 't', 'i', 'o', 'n', 'a', 'l',
|
211
|
+
'('>{};
|
212
|
+
static constexpr basic_string_view<Char> none =
|
213
|
+
detail::string_literal<Char, 'n', 'o', 'n', 'e'>{};
|
214
|
+
|
215
|
+
template <class U>
|
216
|
+
FMT_CONSTEXPR static auto maybe_set_debug_format(U& u, bool set)
|
217
|
+
-> decltype(u.set_debug_format(set)) {
|
218
|
+
u.set_debug_format(set);
|
219
|
+
}
|
220
|
+
|
221
|
+
template <class U>
|
222
|
+
FMT_CONSTEXPR static void maybe_set_debug_format(U&, ...) {}
|
223
|
+
|
224
|
+
public:
|
225
|
+
template <typename ParseContext> FMT_CONSTEXPR auto parse(ParseContext& ctx) {
|
226
|
+
maybe_set_debug_format(underlying_, true);
|
227
|
+
return underlying_.parse(ctx);
|
228
|
+
}
|
229
|
+
|
230
|
+
template <typename FormatContext>
|
231
|
+
auto format(const std::optional<T>& opt, FormatContext& ctx) const
|
232
|
+
-> decltype(ctx.out()) {
|
233
|
+
if (!opt) return detail::write<Char>(ctx.out(), none);
|
234
|
+
|
235
|
+
auto out = ctx.out();
|
236
|
+
out = detail::write<Char>(out, optional);
|
237
|
+
ctx.advance_to(out);
|
238
|
+
out = underlying_.format(*opt, ctx);
|
239
|
+
return detail::write(out, ')');
|
240
|
+
}
|
241
|
+
};
|
242
|
+
FMT_END_NAMESPACE
|
243
|
+
#endif // __cpp_lib_optional
|
244
|
+
|
245
|
+
#ifdef __cpp_lib_source_location
|
246
|
+
FMT_BEGIN_NAMESPACE
|
247
|
+
FMT_EXPORT
|
248
|
+
template <> struct formatter<std::source_location> {
|
249
|
+
template <typename ParseContext> FMT_CONSTEXPR auto parse(ParseContext& ctx) {
|
250
|
+
return ctx.begin();
|
251
|
+
}
|
252
|
+
|
253
|
+
template <typename FormatContext>
|
254
|
+
auto format(const std::source_location& loc, FormatContext& ctx) const
|
255
|
+
-> decltype(ctx.out()) {
|
256
|
+
auto out = ctx.out();
|
257
|
+
out = detail::write(out, loc.file_name());
|
258
|
+
out = detail::write(out, ':');
|
259
|
+
out = detail::write<char>(out, loc.line());
|
260
|
+
out = detail::write(out, ':');
|
261
|
+
out = detail::write<char>(out, loc.column());
|
262
|
+
out = detail::write(out, ": ");
|
263
|
+
out = detail::write(out, loc.function_name());
|
264
|
+
return out;
|
265
|
+
}
|
266
|
+
};
|
267
|
+
FMT_END_NAMESPACE
|
268
|
+
#endif
|
269
|
+
|
270
|
+
#if FMT_CPP_LIB_VARIANT
|
271
|
+
FMT_BEGIN_NAMESPACE
|
272
|
+
namespace detail {
|
273
|
+
|
274
|
+
template <typename T>
|
275
|
+
using variant_index_sequence =
|
276
|
+
std::make_index_sequence<std::variant_size<T>::value>;
|
277
|
+
|
278
|
+
template <typename> struct is_variant_like_ : std::false_type {};
|
279
|
+
template <typename... Types>
|
280
|
+
struct is_variant_like_<std::variant<Types...>> : std::true_type {};
|
281
|
+
|
282
|
+
// formattable element check.
|
283
|
+
template <typename T, typename C> class is_variant_formattable_ {
|
284
|
+
template <std::size_t... Is>
|
285
|
+
static std::conjunction<
|
286
|
+
is_formattable<std::variant_alternative_t<Is, T>, C>...>
|
287
|
+
check(std::index_sequence<Is...>);
|
288
|
+
|
289
|
+
public:
|
290
|
+
static constexpr const bool value =
|
291
|
+
decltype(check(variant_index_sequence<T>{}))::value;
|
292
|
+
};
|
293
|
+
|
294
|
+
template <typename Char, typename OutputIt, typename T>
|
295
|
+
auto write_variant_alternative(OutputIt out, const T& v) -> OutputIt {
|
296
|
+
if constexpr (is_string<T>::value)
|
297
|
+
return write_escaped_string<Char>(out, detail::to_string_view(v));
|
298
|
+
else if constexpr (std::is_same_v<T, Char>)
|
299
|
+
return write_escaped_char(out, v);
|
300
|
+
else
|
301
|
+
return write<Char>(out, v);
|
302
|
+
}
|
303
|
+
|
304
|
+
} // namespace detail
|
305
|
+
|
306
|
+
template <typename T> struct is_variant_like {
|
307
|
+
static constexpr const bool value = detail::is_variant_like_<T>::value;
|
308
|
+
};
|
309
|
+
|
310
|
+
template <typename T, typename C> struct is_variant_formattable {
|
311
|
+
static constexpr const bool value =
|
312
|
+
detail::is_variant_formattable_<T, C>::value;
|
313
|
+
};
|
314
|
+
|
315
|
+
FMT_EXPORT
|
316
|
+
template <typename Char> struct formatter<std::monostate, Char> {
|
317
|
+
template <typename ParseContext>
|
318
|
+
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
319
|
+
return ctx.begin();
|
320
|
+
}
|
321
|
+
|
322
|
+
template <typename FormatContext>
|
323
|
+
auto format(const std::monostate&, FormatContext& ctx) const
|
324
|
+
-> decltype(ctx.out()) {
|
325
|
+
return detail::write<Char>(ctx.out(), "monostate");
|
326
|
+
}
|
327
|
+
};
|
328
|
+
|
329
|
+
FMT_EXPORT
|
330
|
+
template <typename Variant, typename Char>
|
331
|
+
struct formatter<
|
332
|
+
Variant, Char,
|
333
|
+
std::enable_if_t<std::conjunction_v<
|
334
|
+
is_variant_like<Variant>, is_variant_formattable<Variant, Char>>>> {
|
335
|
+
template <typename ParseContext>
|
336
|
+
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
337
|
+
return ctx.begin();
|
338
|
+
}
|
339
|
+
|
340
|
+
template <typename FormatContext>
|
341
|
+
auto format(const Variant& value, FormatContext& ctx) const
|
342
|
+
-> decltype(ctx.out()) {
|
343
|
+
auto out = ctx.out();
|
344
|
+
|
345
|
+
out = detail::write<Char>(out, "variant(");
|
346
|
+
FMT_TRY {
|
347
|
+
std::visit(
|
348
|
+
[&](const auto& v) {
|
349
|
+
out = detail::write_variant_alternative<Char>(out, v);
|
350
|
+
},
|
351
|
+
value);
|
352
|
+
}
|
353
|
+
FMT_CATCH(const std::bad_variant_access&) {
|
354
|
+
detail::write<Char>(out, "valueless by exception");
|
355
|
+
}
|
356
|
+
*out++ = ')';
|
357
|
+
return out;
|
358
|
+
}
|
359
|
+
};
|
360
|
+
FMT_END_NAMESPACE
|
361
|
+
#endif // FMT_CPP_LIB_VARIANT
|
362
|
+
|
363
|
+
FMT_BEGIN_NAMESPACE
|
364
|
+
FMT_EXPORT
|
365
|
+
template <typename Char> struct formatter<std::error_code, Char> {
|
366
|
+
template <typename ParseContext>
|
367
|
+
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
368
|
+
return ctx.begin();
|
369
|
+
}
|
370
|
+
|
371
|
+
template <typename FormatContext>
|
372
|
+
FMT_CONSTEXPR auto format(const std::error_code& ec, FormatContext& ctx) const
|
373
|
+
-> decltype(ctx.out()) {
|
374
|
+
auto out = ctx.out();
|
375
|
+
out = detail::write_bytes(out, ec.category().name(), format_specs<Char>());
|
376
|
+
out = detail::write<Char>(out, Char(':'));
|
377
|
+
out = detail::write<Char>(out, ec.value());
|
378
|
+
return out;
|
379
|
+
}
|
380
|
+
};
|
381
|
+
|
382
|
+
FMT_EXPORT
|
383
|
+
template <typename T, typename Char>
|
384
|
+
struct formatter<
|
385
|
+
T, Char, // DEPRECATED! Mixing code unit types.
|
386
|
+
typename std::enable_if<std::is_base_of<std::exception, T>::value>::type> {
|
387
|
+
private:
|
388
|
+
bool with_typename_ = false;
|
389
|
+
|
390
|
+
public:
|
391
|
+
FMT_CONSTEXPR auto parse(basic_format_parse_context<Char>& ctx)
|
392
|
+
-> decltype(ctx.begin()) {
|
393
|
+
auto it = ctx.begin();
|
394
|
+
auto end = ctx.end();
|
395
|
+
if (it == end || *it == '}') return it;
|
396
|
+
if (*it == 't') {
|
397
|
+
++it;
|
398
|
+
with_typename_ = FMT_USE_TYPEID != 0;
|
399
|
+
}
|
400
|
+
return it;
|
401
|
+
}
|
402
|
+
|
403
|
+
template <typename OutputIt>
|
404
|
+
auto format(const std::exception& ex,
|
405
|
+
basic_format_context<OutputIt, Char>& ctx) const -> OutputIt {
|
406
|
+
format_specs<Char> spec;
|
407
|
+
auto out = ctx.out();
|
408
|
+
if (!with_typename_)
|
409
|
+
return detail::write_bytes(out, string_view(ex.what()), spec);
|
410
|
+
|
411
|
+
#if FMT_USE_TYPEID
|
412
|
+
const std::type_info& ti = typeid(ex);
|
413
|
+
# ifdef FMT_HAS_ABI_CXA_DEMANGLE
|
414
|
+
int status = 0;
|
415
|
+
std::size_t size = 0;
|
416
|
+
std::unique_ptr<char, void (*)(void*)> demangled_name_ptr(
|
417
|
+
abi::__cxa_demangle(ti.name(), nullptr, &size, &status), &std::free);
|
418
|
+
|
419
|
+
string_view demangled_name_view;
|
420
|
+
if (demangled_name_ptr) {
|
421
|
+
demangled_name_view = demangled_name_ptr.get();
|
422
|
+
|
423
|
+
// Normalization of stdlib inline namespace names.
|
424
|
+
// libc++ inline namespaces.
|
425
|
+
// std::__1::* -> std::*
|
426
|
+
// std::__1::__fs::* -> std::*
|
427
|
+
// libstdc++ inline namespaces.
|
428
|
+
// std::__cxx11::* -> std::*
|
429
|
+
// std::filesystem::__cxx11::* -> std::filesystem::*
|
430
|
+
if (demangled_name_view.starts_with("std::")) {
|
431
|
+
char* begin = demangled_name_ptr.get();
|
432
|
+
char* to = begin + 5; // std::
|
433
|
+
for (char *from = to, *end = begin + demangled_name_view.size();
|
434
|
+
from < end;) {
|
435
|
+
// This is safe, because demangled_name is NUL-terminated.
|
436
|
+
if (from[0] == '_' && from[1] == '_') {
|
437
|
+
char* next = from + 1;
|
438
|
+
while (next < end && *next != ':') next++;
|
439
|
+
if (next[0] == ':' && next[1] == ':') {
|
440
|
+
from = next + 2;
|
441
|
+
continue;
|
442
|
+
}
|
443
|
+
}
|
444
|
+
*to++ = *from++;
|
445
|
+
}
|
446
|
+
demangled_name_view = {begin, detail::to_unsigned(to - begin)};
|
447
|
+
}
|
448
|
+
} else {
|
449
|
+
demangled_name_view = string_view(ti.name());
|
450
|
+
}
|
451
|
+
out = detail::write_bytes(out, demangled_name_view, spec);
|
452
|
+
# elif FMT_MSC_VERSION
|
453
|
+
string_view demangled_name_view(ti.name());
|
454
|
+
if (demangled_name_view.starts_with("class "))
|
455
|
+
demangled_name_view.remove_prefix(6);
|
456
|
+
else if (demangled_name_view.starts_with("struct "))
|
457
|
+
demangled_name_view.remove_prefix(7);
|
458
|
+
out = detail::write_bytes(out, demangled_name_view, spec);
|
459
|
+
# else
|
460
|
+
out = detail::write_bytes(out, string_view(ti.name()), spec);
|
461
|
+
# endif
|
462
|
+
*out++ = ':';
|
463
|
+
*out++ = ' ';
|
464
|
+
return detail::write_bytes(out, string_view(ex.what()), spec);
|
465
|
+
#endif
|
466
|
+
}
|
467
|
+
};
|
468
|
+
|
469
|
+
namespace detail {
|
470
|
+
|
471
|
+
template <typename T, typename Enable = void>
|
472
|
+
struct has_flip : std::false_type {};
|
473
|
+
|
474
|
+
template <typename T>
|
475
|
+
struct has_flip<T, void_t<decltype(std::declval<T>().flip())>>
|
476
|
+
: std::true_type {};
|
477
|
+
|
478
|
+
template <typename T> struct is_bit_reference_like {
|
479
|
+
static constexpr const bool value =
|
480
|
+
std::is_convertible<T, bool>::value &&
|
481
|
+
std::is_nothrow_assignable<T, bool>::value && has_flip<T>::value;
|
482
|
+
};
|
483
|
+
|
484
|
+
#ifdef _LIBCPP_VERSION
|
485
|
+
|
486
|
+
// Workaround for libc++ incompatibility with C++ standard.
|
487
|
+
// According to the Standard, `bitset::operator[] const` returns bool.
|
488
|
+
template <typename C>
|
489
|
+
struct is_bit_reference_like<std::__bit_const_reference<C>> {
|
490
|
+
static constexpr const bool value = true;
|
491
|
+
};
|
492
|
+
|
493
|
+
#endif
|
494
|
+
|
495
|
+
} // namespace detail
|
496
|
+
|
497
|
+
// We can't use std::vector<bool, Allocator>::reference and
|
498
|
+
// std::bitset<N>::reference because the compiler can't deduce Allocator and N
|
499
|
+
// in partial specialization.
|
500
|
+
FMT_EXPORT
|
501
|
+
template <typename BitRef, typename Char>
|
502
|
+
struct formatter<BitRef, Char,
|
503
|
+
enable_if_t<detail::is_bit_reference_like<BitRef>::value>>
|
504
|
+
: formatter<bool, Char> {
|
505
|
+
template <typename FormatContext>
|
506
|
+
FMT_CONSTEXPR auto format(const BitRef& v, FormatContext& ctx) const
|
507
|
+
-> decltype(ctx.out()) {
|
508
|
+
return formatter<bool, Char>::format(v, ctx);
|
509
|
+
}
|
510
|
+
};
|
511
|
+
|
512
|
+
FMT_EXPORT
|
513
|
+
template <typename T, typename Char>
|
514
|
+
struct formatter<std::atomic<T>, Char,
|
515
|
+
enable_if_t<is_formattable<T, Char>::value>>
|
516
|
+
: formatter<T, Char> {
|
517
|
+
template <typename FormatContext>
|
518
|
+
auto format(const std::atomic<T>& v, FormatContext& ctx) const
|
519
|
+
-> decltype(ctx.out()) {
|
520
|
+
return formatter<T, Char>::format(v.load(), ctx);
|
521
|
+
}
|
522
|
+
};
|
523
|
+
|
524
|
+
#ifdef __cpp_lib_atomic_flag_test
|
525
|
+
FMT_EXPORT
|
526
|
+
template <typename Char>
|
527
|
+
struct formatter<std::atomic_flag, Char> : formatter<bool, Char> {
|
528
|
+
template <typename FormatContext>
|
529
|
+
auto format(const std::atomic_flag& v, FormatContext& ctx) const
|
530
|
+
-> decltype(ctx.out()) {
|
531
|
+
return formatter<bool, Char>::format(v.test(), ctx);
|
532
|
+
}
|
533
|
+
};
|
534
|
+
#endif // __cpp_lib_atomic_flag_test
|
535
|
+
|
536
|
+
FMT_END_NAMESPACE
|
537
|
+
#endif // FMT_STD_H_
|