22# include <type_traits>
27# if FMT_CPLUSPLUS >= 201703L
28# if FMT_HAS_INCLUDE(<filesystem>) && \
29 (!defined(FMT_CPP_LIB_FILESYSTEM) || FMT_CPP_LIB_FILESYSTEM != 0)
32# if FMT_HAS_INCLUDE(<variant>)
35# if FMT_HAS_INCLUDE(<optional>)
41# if FMT_CPLUSPLUS > 201703L && FMT_HAS_INCLUDE(<source_location>)
42# include <source_location>
44# if FMT_CPLUSPLUS > 202002L && FMT_HAS_INCLUDE(<expected>)
49#if FMT_HAS_INCLUDE(<version>)
54#if FMT_HAS_INCLUDE(<cxxabi.h>) || defined(__GLIBCXX__)
58# ifndef __GABIXX_CXXABI_H__
59# define FMT_HAS_ABI_CXA_DEMANGLE
63#ifdef FMT_CPP_LIB_FILESYSTEM
65#elif defined(__cpp_lib_filesystem)
66# define FMT_CPP_LIB_FILESYSTEM __cpp_lib_filesystem
68# define FMT_CPP_LIB_FILESYSTEM 0
71#ifdef FMT_CPP_LIB_VARIANT
73#elif defined(__cpp_lib_variant)
74# define FMT_CPP_LIB_VARIANT __cpp_lib_variant
76# define FMT_CPP_LIB_VARIANT 0
82#if FMT_CPP_LIB_FILESYSTEM
84template <
typename Char,
typename PathChar>
85auto get_path_string(
const std::filesystem::path&
p,
86 const std::basic_string<PathChar>& native) {
87 if constexpr (std::is_same_v<Char, char> && std::is_same_v<PathChar, wchar_t>)
90 return p.string<Char>();
93template <
typename Char,
typename PathChar>
95 const std::filesystem::path&
p,
96 const std::basic_string<PathChar>& native) {
97 if constexpr (std::is_same_v<Char, char> &&
98 std::is_same_v<PathChar, wchar_t>) {
103 }
else if constexpr (std::is_same_v<Char, PathChar>) {
105 std::back_inserter(quoted), native);
113#if defined(__cpp_lib_expected) || FMT_CPP_LIB_VARIANT
114template <
typename Char,
typename OutputIt,
typename T>
115auto write_escaped_alternative(OutputIt out,
const T& v) -> OutputIt {
116 if constexpr (has_to_string_view<T>::value)
123#if FMT_CPP_LIB_VARIANT
125template <
typename>
struct is_variant_like_ : std::false_type {};
126template <
typename... Types>
127struct is_variant_like_<
std::variant<Types...>> : std::true_type {};
129template <
typename Variant,
typename Char>
class is_variant_formattable {
130 template <
size_t... Is>
131 static auto check(std::index_sequence<Is...>) -> std::conjunction<
135 static constexpr bool value =
decltype(check(
136 std::make_index_sequence<std::variant_size<Variant>::value>()))::value;
143template <
typename OutputIt>
144auto write_demangled_name(OutputIt out,
const std::type_info& ti) -> OutputIt {
145# ifdef FMT_HAS_ABI_CXA_DEMANGLE
148 std::unique_ptr<char, void (*)(
void*)> demangled_name_ptr(
149 abi::__cxa_demangle(ti.name(),
nullptr, &size, &status), &std::free);
152 if (demangled_name_ptr) {
153 demangled_name_view = demangled_name_ptr.get();
163 char* begin = demangled_name_ptr.get();
164 char* to = begin + 5;
165 for (
char *
from = to, *end = begin + demangled_name_view.
size();
168 if (
from[0] ==
'_' &&
from[1] ==
'_') {
169 char* next =
from + 1;
170 while (next < end && *next !=
':') next++;
171 if (next[0] ==
':' && next[1] ==
':') {
184# elif FMT_MSC_VERSION
186 for (
size_t i = 0; i < demangled_name.
size(); ++i) {
187 auto sub = demangled_name;
189 if (sub.starts_with(
"enum ")) {
193 if (sub.starts_with(
"class ") || sub.starts_with(
"union ")) {
197 if (sub.starts_with(
"struct ")) {
201 if (*sub.begin() !=
' ') *out++ = *sub.begin();
211template <
typename T,
typename Enable =
void>
219 static constexpr bool value = std::is_convertible<T, bool>::value &&
220 std::is_nothrow_assignable<T, bool>::value &&
226#if defined(_LIBCPP_VERSION) && !defined(FMT_IMPORT_STD)
229 static constexpr bool value =
true;
233template <
typename T,
typename Enable =
void>
239template <
typename T,
typename Enable =
void>
248template <
typename T,
typename Deleter>
249auto ptr(
const std::unique_ptr<T, Deleter>&
p) ->
const void* {
252template <
typename T>
auto ptr(
const std::shared_ptr<T>&
p) ->
const void* {
256#if FMT_CPP_LIB_FILESYSTEM
258class path :
public std::filesystem::path {
260 auto display_string() const ->
std::
string {
261 const std::filesystem::path& base = *
this;
264 auto system_string() const ->
std::
string {
return string(); }
266 auto generic_display_string() const ->
std::
string {
267 const std::filesystem::path& base = *
this;
270 auto generic_system_string() const ->
std::
string {
return generic_string(); }
273template <
typename Char>
struct formatter<
std::filesystem::path, Char> {
284 auto it = ctx.
begin(), end = ctx.
end();
285 if (it == end)
return it;
288 if (it == end)
return it;
291 if ((c >=
'0' && c <=
'9') || c ==
'{')
293 if (it != end && *it ==
'?') {
301 template <
typename FormatContext>
302 auto format(
const std::filesystem::path&
p, FormatContext& ctx)
const {
305 !path_type_ ?
p.native()
306 :
p.generic_string<std::filesystem::path::value_type>();
311 auto s = detail::get_path_string<Char>(
p, path_string);
315 detail::write_escaped_path(quoted,
p, path_string);
324template <
size_t N,
typename Char>
330 const std::bitset<N>& bs;
332 template <
typename OutputIt>
334 for (
auto pos = N; pos > 0; --pos)
341 template <
typename FormatContext>
342 auto format(
const std::bitset<N>& bs, FormatContext& ctx)
const
343 ->
decltype(ctx.out()) {
344 return this->write_padded(ctx, writer{bs});
348template <
typename Char>
351#ifdef __cpp_lib_optional
352template <
typename T,
typename Char>
354 std::enable_if_t<is_formattable<T, Char>::value>> {
365 ->
decltype(u.set_debug_format(
set)) {
366 u.set_debug_format(
set);
375 return underlying_.parse(ctx);
378 template <
typename FormatContext>
379 auto format(
const std::optional<T>& opt, FormatContext& ctx)
const
380 ->
decltype(ctx.out()) {
383 auto out = ctx.out();
386 out = underlying_.format(*opt, ctx);
392#ifdef __cpp_lib_expected
393template <
typename T,
typename E,
typename Char>
395 std::enable_if_t<(std::is_void<T>::value ||
396 is_formattable<T, Char>::value) &&
397 is_formattable<E, Char>::value>> {
402 template <
typename FormatContext>
403 auto format(
const std::expected<T, E>& value, FormatContext& ctx)
const
404 ->
decltype(ctx.out()) {
405 auto out = ctx.out();
407 if (value.has_value()) {
409 if constexpr (!std::is_void<T>::value)
410 out = detail::write_escaped_alternative<Char>(out, *value);
413 out = detail::write_escaped_alternative<Char>(out, value.error());
421#ifdef __cpp_lib_source_location
425 template <
typename FormatContext>
426 auto format(
const std::source_location& loc, FormatContext& ctx)
const
427 ->
decltype(ctx.out()) {
428 auto out = ctx.out();
441#if FMT_CPP_LIB_VARIANT
443template <
typename T>
struct is_variant_like {
444 static constexpr bool value = detail::is_variant_like_<T>::value;
452 template <
typename FormatContext>
453 auto format(
const std::monostate&, FormatContext& ctx)
const
454 ->
decltype(ctx.out()) {
459template <
typename Variant,
typename Char>
462 is_variant_like<Variant>,
463 detail::is_variant_formattable<Variant, Char>>>> {
468 template <
typename FormatContext>
469 auto format(
const Variant& value, FormatContext& ctx)
const
470 ->
decltype(ctx.out()) {
471 auto out = ctx.out();
477 out = detail::write_escaped_alternative<Char>(out, v);
481 FMT_CATCH(
const std::bad_variant_access&) {
499 auto it = ctx.
begin(), end = ctx.
end();
500 if (it == end)
return it;
505 if (it != end && ((c >=
'0' && c <=
'9') || c ==
'{'))
508 if (it != end && *it ==
'?') {
512 if (it != end && *it ==
's') {
519 template <
typename FormatContext>
521 FormatContext& ctx)
const ->
decltype(ctx.out()) {
527 buf.append(ec.message());
550 template <
typename Context>
551 auto format(
const std::type_info& ti, Context& ctx)
const
552 ->
decltype(ctx.out()) {
553 return detail::write_demangled_name(ctx.out(), ti);
561 typename
std::enable_if<std::is_base_of<std::exception, T>::value>::type> {
563 bool with_typename_ =
false;
567 auto it = ctx.
begin();
568 auto end = ctx.
end();
569 if (it == end || *it ==
'}')
return it;
577 template <
typename Context>
578 auto format(
const std::exception& ex, Context& ctx)
const
579 ->
decltype(ctx.out()) {
580 auto out = ctx.out();
582 if (with_typename_) {
583 out = detail::write_demangled_name(out,
typeid(ex));
595template <
typename BitRef,
typename Char>
599 template <
typename FormatContext>
601 ->
decltype(ctx.out()) {
606template <
typename T,
typename Char>
610 template <
typename FormatContext>
611 auto format(
const std::atomic<T>& v, FormatContext& ctx)
const
612 ->
decltype(ctx.out()) {
617#ifdef __cpp_lib_atomic_flag_test
618template <
typename Char>
620 template <
typename FormatContext>
621 auto format(
const std::atomic_flag& v, FormatContext& ctx)
const
622 ->
decltype(ctx.out()) {
628template <
typename T,
typename Char>
struct formatter<
std::complex<T>, Char> {
632 template <
typename FormatContext,
typename OutputIt>
635 FormatContext& ctx, OutputIt out)
const
655 if (ctx.begin() == ctx.end() || *ctx.begin() ==
'}')
return ctx.begin();
656 return parse_format_specs(ctx.begin(), ctx.end(), specs_, ctx,
660 template <
typename FormatContext>
661 auto format(
const std::complex<T>& c, FormatContext& ctx)
const
662 ->
decltype(ctx.out()) {
671 if (specs.
width == 0)
return do_format(c, specs, ctx, ctx.out());
675 outer_specs.width = specs.
width;
676 outer_specs.copy_fill_from(specs);
677 outer_specs.set_align(specs.
align());
690template <
typename T,
typename Char>
694 enable_if_t<is_formattable<remove_cvref_t<T>, Char>::value &&
695 !detail::has_format_as<T>::value &&
696 !detail::has_format_as_member<T>::value>>
698 template <
typename FormatContext>
699 auto format(std::reference_wrapper<T> ref, FormatContext& ctx)
const
700 ->
decltype(ctx.out()) {
constexpr auto format_as(HAL_AddressableLEDColorOrder order)
Definition AddressableLEDTypes.h:33
and restrictions which apply to each piece of software is included later in this file and or inside of the individual applicable source files The disclaimer of warranty in the WPILib license above applies to all code in and nothing in any of the other licenses gives permission to use the names of FIRST nor the names of the WPILib contributors to endorse or promote products derived from this software The following pieces of software have additional or alternate and or glfw and nanopb were modified for use in Google Inc All rights reserved Redistribution and use in source and binary with or without are permitted provided that the following conditions are this list of conditions and the following disclaimer *Redistributions in binary form must reproduce the above copyright this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution *Neither the name of Google Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY EXPRESS OR IMPLIED BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY OR CONSEQUENTIAL WHETHER IN STRICT OR EVEN IF ADVISED OF THE POSSIBILITY OF SUCH January AND DISTRIBUTION Definitions License shall mean the terms and conditions for and distribution as defined by Sections through of this document Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License Legal Entity shall mean the union of the acting entity and all other entities that control are controlled by or are under common control with that entity For the purposes of this definition control direct or to cause the direction or management of such whether by contract or including but not limited to software source documentation and configuration files Object form shall mean any form resulting from mechanical transformation or translation of a Source including but not limited to compiled object generated and conversions to other media types Work shall mean the work of whether in Source or Object made available under the as indicated by a copyright notice that is included in or attached to the whether in Source or Object that is based or other modifications as a an original work of authorship For the purposes of this Derivative Works shall not include works that remain separable from
Definition ThirdPartyNotices.txt:140
typename std::enable_if< B, T >::type enable_if_t
Definition base.h:304
#define FMT_ASSERT(condition, message)
Definition base.h:391
basic_string_view< char > string_view
Definition base.h:613
#define FMT_TRY
Definition base.h:160
basic_appender< char > appender
Definition base.h:616
#define FMT_CONSTEXPR
Definition base.h:113
#define FMT_BEGIN_NAMESPACE
Definition base.h:253
void void_t
Definition base.h:328
#define FMT_CATCH(x)
Definition base.h:161
#define FMT_CONSTEXPR20
Definition base.h:141
#define FMT_END_NAMESPACE
Definition base.h:256
bool_constant<!std::is_same< detail::mapped_t< conditional_t< std::is_void< T >::value, int *, T >, Char >, void >::value > is_formattable
Definition base.h:2782
A dynamically growing memory buffer for trivially copyable/constructible types with the first SIZE el...
Definition format.h:785
FMT_CONSTEXPR void set_fill(char c)
Definition base.h:810
constexpr auto align() const -> align
Definition base.h:744
FMT_CONSTEXPR auto dynamic_precision() const -> arg_id_kind
Definition base.h:758
FMT_CONSTEXPR void set_sign(fmt::sign s)
Definition base.h:774
constexpr auto dynamic() const -> bool
Definition base.h:767
constexpr auto type() const -> presentation_type
Definition base.h:737
constexpr auto dynamic_width() const -> arg_id_kind
Definition base.h:751
FMT_CONSTEXPR void set_align(fmt::align a)
Definition base.h:747
FMT_CONSTEXPR void set_type(presentation_type t)
Definition base.h:740
constexpr auto size() const noexcept -> size_t
Returns the string size.
Definition base.h:560
FMT_CONSTEXPR void remove_prefix(size_t n) noexcept
Definition base.h:569
FMT_CONSTEXPR auto starts_with(basic_string_view< Char > sv) const noexcept -> bool
Definition base.h:574
auto convert(basic_string_view< WChar > s, to_utf8_error_policy policy=to_utf8_error_policy::abort) -> bool
Definition format.h:1328
Parsing context consisting of a format string range being parsed and an argument counter for automati...
Definition base.h:850
constexpr auto begin() const noexcept -> iterator
Returns an iterator to the beginning of the format string range being parsed.
Definition base.h:869
FMT_CONSTEXPR void advance_to(iterator it)
Advances the begin iterator to it.
Definition base.h:875
constexpr auto end() const noexcept -> iterator
Returns an iterator past the end of the format string range being parsed.
Definition base.h:872
Converts a string literal into a format string that will be parsed at compile time and converted into...
Definition printf.h:50
FMT_CONSTEXPR20 auto isfinite(T value) -> bool
Definition format.h:2617
constexpr auto to_ascii(Char c) -> char
Definition base.h:1297
FMT_CONSTEXPR auto write_bytes(OutputIt out, string_view bytes, const format_specs &specs={}) -> OutputIt
Definition format.h:1702
FMT_CONSTEXPR auto to_unsigned(Int value) -> make_unsigned_t< Int >
Definition base.h:432
auto write_escaped_char(OutputIt out, Char v) -> OutputIt
Definition format.h:1830
FMT_CONSTEXPR auto parse_width(const Char *begin, const Char *end, format_specs &specs, arg_ref< Char > &width_ref, parse_context< Char > &ctx) -> const Char *
Definition base.h:1433
FMT_CONSTEXPR auto parse_align(const Char *begin, const Char *end, format_specs &specs) -> const Char *
Definition format.h:2300
constexpr auto to_string_view(const Char *s) -> basic_string_view< Char >
Definition base.h:948
FMT_CONSTEXPR void handle_dynamic_spec(arg_id_kind kind, int &value, const arg_ref< typename Context::char_type > &ref, Context &ctx)
Definition format.h:3700
FMT_CONSTEXPR FMT_INLINE auto write(basic_appender< Char > out, T value, const format_specs &specs, locale_ref loc) -> basic_appender< Char >
Definition format.h:2125
FMT_CONSTEXPR auto maybe_set_debug_format(Formatter &f, bool set) -> decltype(f.set_debug_format(set))
Definition ranges.h:238
auto write_escaped_string(OutputIt out, basic_string_view< Char > str) -> OutputIt
Definition format.h:1814
Definition PointerIntPair.h:280
auto ptr(const std::unique_ptr< T, Deleter > &p) -> const void *
Definition std.h:249