]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
bump: Upgrade to fmt 10.1.0
authorJoel Rosdahl <joel@rosdahl.net>
Mon, 14 Aug 2023 16:34:36 +0000 (18:34 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Mon, 14 Aug 2023 16:34:36 +0000 (18:34 +0200)
LICENSE.adoc
src/third_party/fmt/core.h
src/third_party/fmt/format.h
src/third_party/fmt/std.h

index 06d94227b429e79f73c7dcc3c65465360984e4ad..e29082d7c997ff29690e21647698206288d8bb69 100644 (file)
@@ -441,9 +441,7 @@ SOFTWARE.
 
 === 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++
index f6886cf41c664a2333c11071ce4e49a4121b02c0..bfdca5f11581f2a2f0bf1b0d0a7d08ad95871bb7 100644 (file)
 #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__)
@@ -1281,9 +1282,9 @@ template <typename Context> class value {
   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`.
@@ -1660,6 +1661,7 @@ template <typename Context> class basic_format_arg {
   ``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(
index dfd5d78abce6c31fbc5263feedb699678abbc9bb..e5bd8b110efe49e12a12b004ea246a4dba671a6f 100644 (file)
@@ -920,7 +920,7 @@ class basic_memory_buffer final : public detail::buffer<T> {
  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.
@@ -3178,7 +3178,8 @@ FMT_CONSTEXPR20 inline void format_dragon(basic_fp<uint128_t> value,
       }
       if (buf[0] == overflow) {
         buf[0] = '1';
-        ++exp10;
+        if ((flags & dragon::fixed) != 0) buf.push_back('0');
+        else ++exp10;
       }
       return;
     }
index a71a59db9a0d11555be914ee4a797d961f1fa1b6..b0e78e10ddfe10a67045d49f49dc98ee552b415a 100644 (file)
@@ -8,6 +8,7 @@
 #ifndef FMT_STD_H_
 #define FMT_STD_H_
 
+#include <bitset>
 #include <cstdlib>
 #include <exception>
 #include <memory>
@@ -15,6 +16,7 @@
 #include <type_traits>
 #include <typeinfo>
 #include <utility>
+#include <vector>
 
 #include "format.h"
 #include "ostream.h"
@@ -389,6 +391,50 @@ struct formatter<
 #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_