std.h
Go to the documentation of this file.
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
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 
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 };
167 #endif // FMT_CPP_LIB_FILESYSTEM
168 
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 
197 template <typename Char>
198 struct formatter<std::thread::id, Char> : basic_ostream_formatter<Char> {};
200 
201 #ifdef __cpp_lib_optional
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 =
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 };
243 #endif // __cpp_lib_optional
244 
245 #ifdef __cpp_lib_source_location
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 };
268 #endif
269 
270 #if FMT_CPP_LIB_VARIANT
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<
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 
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 
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 };
361 #endif // FMT_CPP_LIB_VARIANT
362 
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 
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:
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>
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.
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 
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
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 
537 #endif // FMT_STD_H_
detail::to_utf8_error_policy::replace
@ replace
formatter
Definition: core.h:1087
detail::has_flip
Definition: std.h:472
detail::to_string_view
FMT_INLINE auto to_string_view(const Char *s) -> basic_string_view< Char >
Definition: core.h:534
formatter< std::bitset< N >, Char >::writer::bs
const std::bitset< N > & bs
Definition: std.h:176
ostream.h
format_specs::width
int width
Definition: core.h:2077
basic_memory_buffer
Definition: format.h:883
detail::write_padded
FMT_CONSTEXPR auto write_padded(OutputIt out, const format_specs< Char > &specs, size_t size, size_t width, F &&f) -> OutputIt
Definition: format.h:1730
backward::ColorMode::type
type
Definition: backward.hpp:3600
nonstd::span_lite::size_t
span_CONFIG_SIZE_TYPE size_t
Definition: span.hpp:576
basic_string_view
Definition: core.h:415
s
XmlRpcServer s
format.h
format_specs
Definition: core.h:2076
detail::write
auto write(OutputIt out, const std::tm &time, const std::locale &loc, char format, char modifier=0) -> OutputIt
Definition: chrono.h:419
is_formattable
bool_constant<!std::is_base_of< detail::unformattable, decltype(detail::arg_mapper< buffer_context< Char > >() .map(std::declval< T & >()))>::value > is_formattable
Definition: core.h:1798
detail::arg_ref
Definition: core.h:2101
nonstd::span_lite::std11::false_type
integral_constant< bool, false > false_type
Definition: span.hpp:657
detail
Definition: args.h:19
writer
static int writer(lua_State *L, const void *b, size_t size, void *ud)
Definition: lstrlib.c:222
nonstd::span_lite::std11::true_type
integral_constant< bool, true > true_type
Definition: span.hpp:656
detail::void_t
void void_t
Definition: core.h:1534
detail::parse_align
FMT_CONSTEXPR auto parse_align(char c) -> align_t
Definition: core.h:2194
detail::buffer::data
FMT_CONSTEXPR auto data() noexcept -> T *
Definition: core.h:863
basic_string_view::remove_prefix
FMT_CONSTEXPR void remove_prefix(size_t n) noexcept
Definition: core.h:469
nonstd::span_lite::size
span_constexpr std::size_t size(span< T, Extent > const &spn)
Definition: span.hpp:1554
FMT_CATCH
#define FMT_CATCH(x)
Definition: format.h:140
formatter< T, Char, typename std::enable_if< std::is_base_of< std::exception, T >::value >::type >::parse
FMT_CONSTEXPR auto parse(basic_format_parse_context< Char > &ctx) -> decltype(ctx.begin())
Definition: std.h:391
detail::write_bytes
FMT_CONSTEXPR auto write_bytes(OutputIt out, string_view bytes, const format_specs< Char > &specs) -> OutputIt
Definition: format.h:1755
formatter< std::error_code, Char >::parse
FMT_CONSTEXPR auto parse(ParseContext &ctx) -> decltype(ctx.begin())
Definition: std.h:367
FMT_END_NAMESPACE
#define FMT_END_NAMESPACE
Definition: core.h:180
detail::maybe_set_debug_format
FMT_CONSTEXPR auto maybe_set_debug_format(Formatter &f, bool set) -> decltype(f.set_debug_format(set))
Definition: ranges.h:288
FMT_EXPORT
#define FMT_EXPORT
Definition: core.h:186
check
static void check(LexState *ls, int c)
Definition: lparser.c:107
detail::value
Definition: core.h:1257
enable_if_t
typename std::enable_if< B, T >::type enable_if_t
Definition: core.h:271
nlohmann::detail::void
j template void())
Definition: json.hpp:4061
basic_string_view::starts_with
FMT_CONSTEXPR_CHAR_TRAITS auto starts_with(basic_string_view< Char > sv) const noexcept -> bool
Definition: core.h:474
detail::is_bit_reference_like
Definition: std.h:478
nlohmann::detail::parse_event_t::value
@ value
the parser finished reading a JSON value
nested_formatter
Definition: format.h:4190
format
auto format(const text_style &ts, const S &format_str, const Args &... args) -> std::basic_string< Char >
Definition: color.h:543
detail::string_literal
Definition: format.h:289
string_view
basic_string_view< char > string_view
Definition: core.h:518
basic_format_parse_context
Definition: core.h:674
detail::to_utf8::convert
auto convert(basic_string_view< WChar > s, to_utf8_error_policy policy=to_utf8_error_policy::abort) -> bool
Definition: format.h:1405
detail::write_escaped_char
auto write_escaped_char(OutputIt out, Char v) -> OutputIt
Definition: format.h:1922
formatter< BitRef, Char, enable_if_t< detail::is_bit_reference_like< BitRef >::value > >::format
FMT_CONSTEXPR auto format(const BitRef &v, FormatContext &ctx) const -> decltype(ctx.out())
Definition: std.h:506
formatter< std::error_code, Char >::format
FMT_CONSTEXPR auto format(const std::error_code &ec, FormatContext &ctx) const -> decltype(ctx.out())
Definition: std.h:372
formatter< std::atomic< T >, Char, enable_if_t< is_formattable< T, Char >::value > >::format
auto format(const std::atomic< T > &v, FormatContext &ctx) const -> decltype(ctx.out())
Definition: std.h:518
FMT_ASSERT
#define FMT_ASSERT(condition, message)
Definition: core.h:353
presentation_type::none
@ none
FMT_USE_TYPEID
#define FMT_USE_TYPEID
Definition: std.h:62
std
formatter< T, Char, typename std::enable_if< std::is_base_of< std::exception, T >::value >::type >::format
auto format(const std::exception &ex, basic_format_context< OutputIt, Char > &ctx) const -> OutputIt
Definition: std.h:404
C
#define C(name, bit)
Definition: zstd.c:4811
atomic
static lu_mem atomic(lua_State *L)
Definition: lgc.c:1516
detail::parse_dynamic_spec
FMT_CONSTEXPR auto parse_dynamic_spec(const Char *begin, const Char *end, int &value, arg_ref< Char > &ref, basic_format_parse_context< Char > &ctx) -> const Char *
Definition: core.h:2271
sol::unicode::error_code
error_code
Definition: sol.hpp:13048
FMT_BEGIN_NAMESPACE
#define FMT_BEGIN_NAMESPACE
Definition: core.h:177
formatter< std::bitset< N >, Char >::format
auto format(const std::bitset< N > &bs, FormatContext &ctx) const -> decltype(ctx.out())
Definition: std.h:190
FMT_TRY
#define FMT_TRY
Definition: format.h:139
basic_format_context
Definition: core.h:1739
monostate
Definition: core.h:293
detail::to_unsigned
FMT_CONSTEXPR auto to_unsigned(Int value) -> typename std::make_unsigned< Int >::type
Definition: core.h:391
basic_ostream_formatter
Definition: ostream.h:143
next
#define next(ls)
Definition: llex.c:32
range_format::set
@ set
FMT_CONSTEXPR
#define FMT_CONSTEXPR
Definition: core.h:105
formatter< std::bitset< N >, Char >::writer::operator()
FMT_CONSTEXPR auto operator()(OutputIt out) -> OutputIt
Definition: std.h:179


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Aug 11 2024 02:24:26