mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-09 10:39:02 -04:00
Update the vendored libraries.
This commit is contained in:
parent
5c09bb5b67
commit
3479a556d0
2
vendor/README.md
vendored
2
vendor/README.md
vendored
@ -18,7 +18,7 @@ This directory contains vendored dependencies that are shipped with InspIRCd to
|
||||
|
||||
**License** — MIT License
|
||||
|
||||
**Version** — 11.0.1
|
||||
**Version** — 11.0.2
|
||||
|
||||
**Website** — [https://github.com/fmtlib/fmt/](https://github.com/fmtlib/fmt/)
|
||||
|
||||
|
78
vendor/fmt/base.h
vendored
78
vendor/fmt/base.h
vendored
@ -23,7 +23,7 @@
|
||||
#endif
|
||||
|
||||
// The fmt library version in the form major * 10000 + minor * 100 + patch.
|
||||
#define FMT_VERSION 110001
|
||||
#define FMT_VERSION 110002
|
||||
|
||||
// Detect compiler versions.
|
||||
#if defined(__clang__) && !defined(__ibmxl__)
|
||||
@ -441,7 +441,8 @@ struct is_std_string_like : std::false_type {};
|
||||
template <typename T>
|
||||
struct is_std_string_like<T, void_t<decltype(std::declval<T>().find_first_of(
|
||||
typename T::value_type(), 0))>>
|
||||
: std::true_type {};
|
||||
: std::is_convertible<decltype(std::declval<T>().data()),
|
||||
const typename T::value_type*> {};
|
||||
|
||||
// Returns true iff the literal encoding is UTF-8.
|
||||
constexpr auto is_utf8_enabled() -> bool {
|
||||
@ -466,6 +467,7 @@ template <typename Char> FMT_CONSTEXPR auto length(const Char* s) -> size_t {
|
||||
template <typename Char>
|
||||
FMT_CONSTEXPR auto compare(const Char* s1, const Char* s2, std::size_t n)
|
||||
-> int {
|
||||
if (!is_constant_evaluated() && sizeof(Char) == 1) return memcmp(s1, s2, n);
|
||||
for (; n != 0; ++s1, ++s2, --n) {
|
||||
if (*s1 < *s2) return -1;
|
||||
if (*s1 > *s2) return 1;
|
||||
@ -473,14 +475,22 @@ FMT_CONSTEXPR auto compare(const Char* s1, const Char* s2, std::size_t n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
namespace adl {
|
||||
using namespace std;
|
||||
|
||||
template <typename Container>
|
||||
auto invoke_back_inserter()
|
||||
-> decltype(back_inserter(std::declval<Container&>()));
|
||||
} // namespace adl
|
||||
|
||||
template <typename It, typename Enable = std::true_type>
|
||||
struct is_back_insert_iterator : std::false_type {};
|
||||
|
||||
template <typename It>
|
||||
struct is_back_insert_iterator<
|
||||
It,
|
||||
bool_constant<std::is_same<
|
||||
decltype(back_inserter(std::declval<typename It::container_type&>())),
|
||||
It>::value>> : std::true_type {};
|
||||
It, bool_constant<std::is_same<
|
||||
decltype(adl::invoke_back_inserter<typename It::container_type>()),
|
||||
It>::value>> : std::true_type {};
|
||||
|
||||
// Extracts a reference to the container from *insert_iterator.
|
||||
template <typename OutputIt>
|
||||
@ -611,11 +621,12 @@ namespace detail {
|
||||
// to it, deducing Char. Explicitly convertible types such as the ones returned
|
||||
// from FMT_STRING are intentionally excluded.
|
||||
template <typename Char, FMT_ENABLE_IF(is_char<Char>::value)>
|
||||
auto to_string_view(const Char* s) -> basic_string_view<Char> {
|
||||
constexpr auto to_string_view(const Char* s) -> basic_string_view<Char> {
|
||||
return s;
|
||||
}
|
||||
template <typename T, FMT_ENABLE_IF(is_std_string_like<T>::value)>
|
||||
auto to_string_view(const T& s) -> basic_string_view<typename T::value_type> {
|
||||
constexpr auto to_string_view(const T& s)
|
||||
-> basic_string_view<typename T::value_type> {
|
||||
return s;
|
||||
}
|
||||
template <typename Char>
|
||||
@ -919,12 +930,9 @@ template <typename T> class buffer {
|
||||
try_reserve(size_ + count);
|
||||
auto free_cap = capacity_ - size_;
|
||||
if (free_cap < count) count = free_cap;
|
||||
if (std::is_same<T, U>::value) {
|
||||
memcpy(ptr_ + size_, begin, count * sizeof(T));
|
||||
} else {
|
||||
T* out = ptr_ + size_;
|
||||
for (size_t i = 0; i < count; ++i) out[i] = begin[i];
|
||||
}
|
||||
// A loop is faster than memcpy on small sizes.
|
||||
T* out = ptr_ + size_;
|
||||
for (size_t i = 0; i < count; ++i) out[i] = begin[i];
|
||||
size_ += count;
|
||||
begin += count;
|
||||
}
|
||||
@ -1157,6 +1165,7 @@ template <typename T> class basic_appender {
|
||||
using difference_type = ptrdiff_t;
|
||||
using pointer = T*;
|
||||
using reference = T&;
|
||||
using container_type = detail::buffer<T>;
|
||||
FMT_UNCHECKED_ITERATOR(basic_appender);
|
||||
|
||||
FMT_CONSTEXPR basic_appender(detail::buffer<T>& buf) : buffer_(&buf) {}
|
||||
@ -1173,6 +1182,8 @@ template <typename T> class basic_appender {
|
||||
using appender = basic_appender<char>;
|
||||
|
||||
namespace detail {
|
||||
template <typename T>
|
||||
struct is_back_insert_iterator<basic_appender<T>> : std::true_type {};
|
||||
|
||||
template <typename T, typename Enable = void>
|
||||
struct locking : std::true_type {};
|
||||
@ -1189,12 +1200,6 @@ FMT_CONSTEXPR inline auto is_locking() -> bool {
|
||||
}
|
||||
|
||||
// An optimized version of std::copy with the output value type (T).
|
||||
template <typename T, typename InputIt>
|
||||
auto copy(InputIt begin, InputIt end, appender out) -> appender {
|
||||
get_container(out).append(begin, end);
|
||||
return out;
|
||||
}
|
||||
|
||||
template <typename T, typename InputIt, typename OutputIt,
|
||||
FMT_ENABLE_IF(is_back_insert_iterator<OutputIt>::value)>
|
||||
auto copy(InputIt begin, InputIt end, OutputIt out) -> OutputIt {
|
||||
@ -1209,14 +1214,6 @@ FMT_CONSTEXPR auto copy(InputIt begin, InputIt end, OutputIt out) -> OutputIt {
|
||||
return out;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FMT_CONSTEXPR auto copy(const T* begin, const T* end, T* out) -> T* {
|
||||
if (is_constant_evaluated()) return copy<T, const T*, T*>(begin, end, out);
|
||||
auto size = to_unsigned(end - begin);
|
||||
if (size > 0) memcpy(out, begin, size * sizeof(T));
|
||||
return out + size;
|
||||
}
|
||||
|
||||
template <typename T, typename V, typename OutputIt>
|
||||
FMT_CONSTEXPR auto copy(basic_string_view<V> s, OutputIt out) -> OutputIt {
|
||||
return copy<T>(s.begin(), s.end(), out);
|
||||
@ -1238,12 +1235,25 @@ constexpr auto has_const_formatter() -> bool {
|
||||
return has_const_formatter_impl<Context>(static_cast<T*>(nullptr));
|
||||
}
|
||||
|
||||
template <typename It, typename Enable = std::true_type>
|
||||
struct is_buffer_appender : std::false_type {};
|
||||
template <typename It>
|
||||
struct is_buffer_appender<
|
||||
It, bool_constant<
|
||||
is_back_insert_iterator<It>::value &&
|
||||
std::is_base_of<buffer<typename It::container_type::value_type>,
|
||||
typename It::container_type>::value>>
|
||||
: std::true_type {};
|
||||
|
||||
// Maps an output iterator to a buffer.
|
||||
template <typename T, typename OutputIt>
|
||||
template <typename T, typename OutputIt,
|
||||
FMT_ENABLE_IF(!is_buffer_appender<OutputIt>::value)>
|
||||
auto get_buffer(OutputIt out) -> iterator_buffer<OutputIt, T> {
|
||||
return iterator_buffer<OutputIt, T>(out);
|
||||
}
|
||||
template <typename T> auto get_buffer(basic_appender<T> out) -> buffer<T>& {
|
||||
template <typename T, typename OutputIt,
|
||||
FMT_ENABLE_IF(is_buffer_appender<OutputIt>::value)>
|
||||
auto get_buffer(OutputIt out) -> buffer<T>& {
|
||||
return get_container(out);
|
||||
}
|
||||
|
||||
@ -1475,6 +1485,12 @@ template <typename Context> struct arg_mapper {
|
||||
|
||||
FMT_MAP_API auto map(void* val) -> const void* { return val; }
|
||||
FMT_MAP_API auto map(const void* val) -> const void* { return val; }
|
||||
FMT_MAP_API auto map(volatile void* val) -> const void* {
|
||||
return const_cast<const void*>(val);
|
||||
}
|
||||
FMT_MAP_API auto map(const volatile void* val) -> const void* {
|
||||
return const_cast<const void*>(val);
|
||||
}
|
||||
FMT_MAP_API auto map(std::nullptr_t val) -> const void* { return val; }
|
||||
|
||||
// Use SFINAE instead of a const T* parameter to avoid a conflict with the
|
||||
@ -1760,7 +1776,7 @@ template <typename Context> class basic_format_arg {
|
||||
* `vis(value)` will be called with the value of type `double`.
|
||||
*/
|
||||
template <typename Visitor>
|
||||
FMT_CONSTEXPR auto visit(Visitor&& vis) const -> decltype(vis(0)) {
|
||||
FMT_CONSTEXPR FMT_INLINE auto visit(Visitor&& vis) const -> decltype(vis(0)) {
|
||||
switch (type_) {
|
||||
case detail::type::none_type:
|
||||
break;
|
||||
|
40
vendor/fmt/format-inl.h
vendored
40
vendor/fmt/format-inl.h
vendored
@ -1443,12 +1443,26 @@ template <typename T> struct span {
|
||||
size_t size;
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
inline void flockfile(FILE* f) { _lock_file(f); }
|
||||
inline void funlockfile(FILE* f) { _unlock_file(f); }
|
||||
inline int getc_unlocked(FILE* f) { return _fgetc_nolock(f); }
|
||||
template <typename F> auto flockfile(F* f) -> decltype(_lock_file(f)) {
|
||||
_lock_file(f);
|
||||
}
|
||||
template <typename F> auto funlockfile(F* f) -> decltype(_unlock_file(f)) {
|
||||
_unlock_file(f);
|
||||
}
|
||||
|
||||
#ifndef getc_unlocked
|
||||
template <typename F> auto getc_unlocked(F* f) -> decltype(_fgetc_nolock(f)) {
|
||||
return _fgetc_nolock(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
template <typename F = FILE, typename Enable = void>
|
||||
struct has_flockfile : std::false_type {};
|
||||
|
||||
template <typename F>
|
||||
struct has_flockfile<F, void_t<decltype(flockfile(&std::declval<F&>()))>>
|
||||
: std::true_type {};
|
||||
|
||||
// A FILE wrapper. F is FILE defined as a template parameter to make system API
|
||||
// detection work.
|
||||
template <typename F> class file_base {
|
||||
@ -1619,7 +1633,15 @@ inline auto get_file(FILE* f, ...) -> fallback_file<FILE> { return f; }
|
||||
|
||||
using file_ref = decltype(get_file(static_cast<FILE*>(nullptr), 0));
|
||||
|
||||
template <typename F = FILE, typename Enable = void>
|
||||
class file_print_buffer : public buffer<char> {
|
||||
public:
|
||||
explicit file_print_buffer(F*) : buffer(nullptr, size_t()) {}
|
||||
};
|
||||
|
||||
template <typename F>
|
||||
class file_print_buffer<F, enable_if_t<has_flockfile<F>::value>>
|
||||
: public buffer<char> {
|
||||
private:
|
||||
file_ref file_;
|
||||
|
||||
@ -1634,7 +1656,7 @@ class file_print_buffer : public buffer<char> {
|
||||
}
|
||||
|
||||
public:
|
||||
explicit file_print_buffer(FILE* f) : buffer(grow, size_t()), file_(f) {
|
||||
explicit file_print_buffer(F* f) : buffer(grow, size_t()), file_(f) {
|
||||
flockfile(f);
|
||||
file_.init_buffer();
|
||||
auto buf = file_.get_write_buffer();
|
||||
@ -1643,7 +1665,8 @@ class file_print_buffer : public buffer<char> {
|
||||
~file_print_buffer() {
|
||||
file_.advance_write_buffer(size());
|
||||
bool flush = file_.needs_flush();
|
||||
funlockfile(file_);
|
||||
F* f = file_; // Make funlockfile depend on the template parameter F
|
||||
funlockfile(f); // for the system API detection to work.
|
||||
if (flush) fflush(file_);
|
||||
}
|
||||
};
|
||||
@ -1692,8 +1715,9 @@ FMT_FUNC void vprint_buffered(std::FILE* f, string_view fmt, format_args args) {
|
||||
}
|
||||
|
||||
FMT_FUNC void vprint(std::FILE* f, string_view fmt, format_args args) {
|
||||
if (!detail::file_ref(f).is_buffered()) return vprint_buffered(f, fmt, args);
|
||||
auto&& buffer = detail::file_print_buffer(f);
|
||||
if (!detail::file_ref(f).is_buffered() || !detail::has_flockfile<>())
|
||||
return vprint_buffered(f, fmt, args);
|
||||
auto&& buffer = detail::file_print_buffer<>(f);
|
||||
return detail::vformat_to(buffer, fmt, args);
|
||||
}
|
||||
|
||||
|
36
vendor/fmt/format.h
vendored
36
vendor/fmt/format.h
vendored
@ -106,6 +106,13 @@
|
||||
# define FMT_NOINLINE
|
||||
#endif
|
||||
|
||||
namespace std {
|
||||
template <> struct iterator_traits<fmt::appender> {
|
||||
using iterator_category = output_iterator_tag;
|
||||
using value_type = char;
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
#ifndef FMT_THROW
|
||||
# if FMT_EXCEPTIONS
|
||||
# if FMT_MSC_VERSION || defined(__NVCC__)
|
||||
@ -546,6 +553,7 @@ constexpr auto to_pointer(OutputIt, size_t) -> T* {
|
||||
template <typename T> auto to_pointer(basic_appender<T> it, size_t n) -> T* {
|
||||
buffer<T>& buf = get_container(it);
|
||||
auto size = buf.size();
|
||||
buf.try_reserve(size + n);
|
||||
if (buf.capacity() < size + n) return nullptr;
|
||||
buf.try_resize(size + n);
|
||||
return buf.data() + size;
|
||||
@ -1119,7 +1127,7 @@ template <typename Char, typename Sign> constexpr auto sign(Sign s) -> Char {
|
||||
#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 604
|
||||
static_assert(std::is_same<Sign, sign_t>::value, "");
|
||||
#endif
|
||||
return static_cast<Char>("\0-+ "[s]);
|
||||
return static_cast<char>(((' ' << 24) | ('+' << 16) | ('-' << 8)) >> (s * 8));
|
||||
}
|
||||
|
||||
template <typename T> FMT_CONSTEXPR auto count_digits_fallback(T n) -> int {
|
||||
@ -2317,15 +2325,13 @@ FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt {
|
||||
if (negative) abs_value = ~abs_value + 1;
|
||||
int num_digits = count_digits(abs_value);
|
||||
auto size = (negative ? 1 : 0) + static_cast<size_t>(num_digits);
|
||||
auto it = reserve(out, size);
|
||||
if (auto ptr = to_pointer<Char>(it, size)) {
|
||||
if (auto ptr = to_pointer<Char>(out, size)) {
|
||||
if (negative) *ptr++ = static_cast<Char>('-');
|
||||
format_decimal<Char>(ptr, abs_value, num_digits);
|
||||
return out;
|
||||
}
|
||||
if (negative) *it++ = static_cast<Char>('-');
|
||||
it = format_decimal<Char>(it, abs_value, num_digits).end;
|
||||
return base_iterator(out, it);
|
||||
if (negative) *out++ = static_cast<Char>('-');
|
||||
return format_decimal<Char>(out, abs_value, num_digits).end;
|
||||
}
|
||||
|
||||
// DEPRECATED!
|
||||
@ -3629,9 +3635,7 @@ auto write(OutputIt out, monostate, format_specs = {}, locale_ref = {})
|
||||
template <typename Char, typename OutputIt>
|
||||
FMT_CONSTEXPR auto write(OutputIt out, basic_string_view<Char> value)
|
||||
-> OutputIt {
|
||||
auto it = reserve(out, value.size());
|
||||
it = copy_noinline<Char>(value.begin(), value.end(), it);
|
||||
return base_iterator(out, it);
|
||||
return copy_noinline<Char>(value.begin(), value.end(), out);
|
||||
}
|
||||
|
||||
template <typename Char, typename OutputIt, typename T,
|
||||
@ -3972,15 +3976,19 @@ struct formatter<T, Char, enable_if_t<detail::has_format_as<T>::value>>
|
||||
: formatter<detail::format_as_t<T>, Char> {
|
||||
template <typename FormatContext>
|
||||
auto format(const T& value, FormatContext& ctx) const -> decltype(ctx.out()) {
|
||||
using base = formatter<detail::format_as_t<T>, Char>;
|
||||
auto&& val = format_as(value); // Make an lvalue reference for format.
|
||||
return base::format(val, ctx);
|
||||
return formatter<detail::format_as_t<T>, Char>::format(val, ctx);
|
||||
}
|
||||
};
|
||||
|
||||
#define FMT_FORMAT_AS(Type, Base) \
|
||||
template <typename Char> \
|
||||
struct formatter<Type, Char> : formatter<Base, Char> {}
|
||||
#define FMT_FORMAT_AS(Type, Base) \
|
||||
template <typename Char> \
|
||||
struct formatter<Type, Char> : formatter<Base, Char> { \
|
||||
template <typename FormatContext> \
|
||||
auto format(Type value, FormatContext& ctx) const -> decltype(ctx.out()) { \
|
||||
return formatter<Base, Char>::format(value, ctx); \
|
||||
} \
|
||||
}
|
||||
|
||||
FMT_FORMAT_AS(signed char, int);
|
||||
FMT_FORMAT_AS(unsigned char, unsigned);
|
||||
|
2
vendor/fmt/ranges.h
vendored
2
vendor/fmt/ranges.h
vendored
@ -490,7 +490,7 @@ struct range_formatter<
|
||||
auto out = ctx.out();
|
||||
auto it = detail::range_begin(range);
|
||||
auto end = detail::range_end(range);
|
||||
if (is_debug) return write_debug_string(out, it, end);
|
||||
if (is_debug) return write_debug_string(out, std::move(it), end);
|
||||
|
||||
out = detail::copy<Char>(opening_bracket_, out);
|
||||
int i = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user