=== src/third_party/fmt/*.h and src/third_party/format.cpp
-This is a subset of https://fmt.dev[fmt] commit
-8a4bec5cf53387356738a06ba0cf4fdf086241ae (version 10.0.0 plus recent
-development) with the following license:
+This is a subset of https://fmt.dev[fmt] 10.1.0 with the following license:
----
Formatting library for C++
#include <cstring> // std::strlen
#include <iterator>
#include <limits>
+#include <memory> // std::addressof
#include <string>
#include <type_traits>
// The fmt library version in the form major * 10000 + minor * 100 + patch.
-#define FMT_VERSION 100001
+#define FMT_VERSION 100100
#if defined(__clang__) && !defined(__ibmxl__)
# define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__)
FMT_INLINE value(const named_arg_info<char_type>* args, size_t size)
: named_args{args, size} {}
- template <typename T> FMT_CONSTEXPR FMT_INLINE value(T& val) {
+ template <typename T> FMT_CONSTEXPR20 FMT_INLINE value(T& val) {
using value_type = remove_const_t<T>;
- custom.value = const_cast<value_type*>(&val);
+ custom.value = const_cast<value_type*>(std::addressof(val));
// Get the formatter type through the context to allow different contexts
// have different extension points, e.g. `formatter<T>` for `format` and
// `printf_formatter<T>` for `printf`.
``vis(value)`` will be called with the value of type ``double``.
\endrst
*/
+// DEPRECATED!
FMT_EXPORT
template <typename Visitor, typename Context>
FMT_CONSTEXPR FMT_INLINE auto visit_format_arg(
private:
T store_[SIZE];
- // Don't inherit from Allocator avoid generating type_info for it.
+ // Don't inherit from Allocator to avoid generating type_info for it.
FMT_NO_UNIQUE_ADDRESS Allocator alloc_;
// Deallocate memory allocated by the buffer.
}
if (buf[0] == overflow) {
buf[0] = '1';
- ++exp10;
+ if ((flags & dragon::fixed) != 0) buf.push_back('0');
+ else ++exp10;
}
return;
}
#ifndef FMT_STD_H_
#define FMT_STD_H_
+#include <bitset>
#include <cstdlib>
#include <exception>
#include <memory>
#include <type_traits>
#include <typeinfo>
#include <utility>
+#include <vector>
#include "format.h"
#include "ostream.h"
#endif
}
};
+
+namespace detail {
+
+template <typename T, typename Enable = void>
+struct has_flip : std::false_type {};
+
+template <typename T>
+struct has_flip<T, void_t<decltype(std::declval<T>().flip())>>
+ : std::true_type {};
+
+template <typename T> struct is_bit_reference_like {
+ static constexpr const bool value =
+ std::is_convertible<T, bool>::value &&
+ std::is_nothrow_assignable<T, bool>::value && has_flip<T>::value;
+};
+
+#ifdef _LIBCPP_VERSION
+
+// Workaround for libc++ incompatibility with C++ standard.
+// According to the Standard, `bitset::operator[] const` returns bool.
+template <typename C>
+struct is_bit_reference_like<std::__bit_const_reference<C>> {
+ static constexpr const bool value = true;
+};
+
+#endif
+
+} // namespace detail
+
+// We can't use std::vector<bool, Allocator>::reference and
+// std::bitset<N>::reference because the compiler can't deduce Allocator and N
+// in partial specialization.
+FMT_EXPORT
+template <typename BitRef, typename Char>
+struct formatter<BitRef, Char,
+ enable_if_t<detail::is_bit_reference_like<BitRef>::value>>
+ : formatter<bool, Char> {
+ template <typename FormatContext>
+ FMT_CONSTEXPR auto format(const BitRef& v, FormatContext& ctx) const
+ -> decltype(ctx.out()) {
+ return formatter<bool, Char>::format(v, ctx);
+ }
+};
+
FMT_END_NAMESPACE
#endif // FMT_STD_H_