mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-30 02:37:36 +02:00
Remove dependency on string_view
This commit is contained in:
@ -12,7 +12,7 @@
|
|||||||
#include <memory> // std::unique_ptr
|
#include <memory> // std::unique_ptr
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "core.h"
|
#include "format.h" // std_string_view
|
||||||
|
|
||||||
FMT_BEGIN_NAMESPACE
|
FMT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
@ -8,12 +8,12 @@
|
|||||||
#ifndef FMT_CORE_H_
|
#ifndef FMT_CORE_H_
|
||||||
#define FMT_CORE_H_
|
#define FMT_CORE_H_
|
||||||
|
|
||||||
#include <cstddef> // std::byte
|
#include <cstddef> // std::byte
|
||||||
#include <cstdio> // std::FILE
|
#include <cstdio> // std::FILE
|
||||||
#include <cstring> // std::strlen
|
#include <cstring> // std::strlen
|
||||||
#include <limits> // std::numeric_limits
|
#include <limits> // std::numeric_limits
|
||||||
#include <string>
|
#include <string> // std::string
|
||||||
#include <type_traits>
|
#include <type_traits> // std::enable_if
|
||||||
|
|
||||||
// The fmt library version in the form major * 10000 + minor * 100 + patch.
|
// The fmt library version in the form major * 10000 + minor * 100 + patch.
|
||||||
#define FMT_VERSION 100200
|
#define FMT_VERSION 100200
|
||||||
@ -209,16 +209,6 @@
|
|||||||
# define FMT_API
|
# define FMT_API
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// libc++ supports string_view in pre-c++17.
|
|
||||||
#if FMT_HAS_INCLUDE(<string_view>) && \
|
|
||||||
(FMT_CPLUSPLUS >= 201703L || defined(_LIBCPP_VERSION))
|
|
||||||
# include <string_view>
|
|
||||||
# define FMT_USE_STRING_VIEW
|
|
||||||
#elif FMT_HAS_INCLUDE("experimental/string_view") && FMT_CPLUSPLUS >= 201402L
|
|
||||||
# include <experimental/string_view>
|
|
||||||
# define FMT_USE_EXPERIMENTAL_STRING_VIEW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FMT_UNICODE
|
#ifndef FMT_UNICODE
|
||||||
# define FMT_UNICODE !FMT_MSC_VERSION
|
# define FMT_UNICODE !FMT_MSC_VERSION
|
||||||
#endif
|
#endif
|
||||||
@ -287,10 +277,15 @@ template <typename T> using type_identity_t = typename type_identity<T>::type;
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
using underlying_t = typename std::underlying_type<T>::type;
|
using underlying_t = typename std::underlying_type<T>::type;
|
||||||
|
|
||||||
// Checks whether T is a container with contiguous storage.
|
#if FMT_GCC_VERSION && FMT_GCC_VERSION < 500
|
||||||
template <typename T> struct is_contiguous : std::false_type {};
|
// A workaround for gcc 4.8 to make void_t work in a SFINAE context.
|
||||||
template <typename Char>
|
template <typename...> struct void_t_impl {
|
||||||
struct is_contiguous<std::basic_string<Char>> : std::true_type {};
|
using type = void;
|
||||||
|
};
|
||||||
|
template <typename... T> using void_t = typename void_t_impl<T...>::type;
|
||||||
|
#else
|
||||||
|
template <typename...> using void_t = void;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct monostate {
|
struct monostate {
|
||||||
constexpr monostate() {}
|
constexpr monostate() {}
|
||||||
@ -388,15 +383,6 @@ FMT_NORETURN FMT_API void assert_fail(const char* file, int line,
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(FMT_USE_STRING_VIEW)
|
|
||||||
template <typename Char> using std_string_view = std::basic_string_view<Char>;
|
|
||||||
#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW)
|
|
||||||
template <typename Char>
|
|
||||||
using std_string_view = std::experimental::basic_string_view<Char>;
|
|
||||||
#else
|
|
||||||
template <typename T> struct std_string_view {};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FMT_USE_INT128
|
#ifdef FMT_USE_INT128
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
#elif defined(__SIZEOF_INT128__) && !defined(__NVCC__) && \
|
#elif defined(__SIZEOF_INT128__) && !defined(__NVCC__) && \
|
||||||
@ -425,6 +411,15 @@ FMT_CONSTEXPR auto to_unsigned(Int value) ->
|
|||||||
return static_cast<typename std::make_unsigned<Int>::type>(value);
|
return static_cast<typename std::make_unsigned<Int>::type>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Enable = void>
|
||||||
|
struct is_string_like : std::false_type {};
|
||||||
|
|
||||||
|
// A heuristic to detect std::string and std::string_view.
|
||||||
|
template <typename T>
|
||||||
|
struct is_string_like<T, void_t<decltype(std::declval<T>().find_first_of(
|
||||||
|
typename T::value_type(), 0))>> : std::true_type {
|
||||||
|
};
|
||||||
|
|
||||||
FMT_CONSTEXPR inline auto is_utf8() -> bool {
|
FMT_CONSTEXPR inline auto is_utf8() -> bool {
|
||||||
FMT_MSC_WARNING(suppress : 4566) constexpr unsigned char section[] = "\u00A7";
|
FMT_MSC_WARNING(suppress : 4566) constexpr unsigned char section[] = "\u00A7";
|
||||||
|
|
||||||
@ -451,6 +446,15 @@ FMT_CONSTEXPR auto compare(const Char* s1, const Char* s2, std::size_t n)
|
|||||||
}
|
}
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
using basic_string =
|
||||||
|
std::basic_string<Char, std::char_traits<Char>, std::allocator<Char>>;
|
||||||
|
|
||||||
|
// Checks whether T is a container with contiguous storage.
|
||||||
|
template <typename T> struct is_contiguous : std::false_type {};
|
||||||
|
template <typename Char>
|
||||||
|
struct is_contiguous<basic_string<Char>> : std::true_type {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
An implementation of ``std::basic_string_view`` for pre-C++17. It provides a
|
An implementation of ``std::basic_string_view`` for pre-C++17. It provides a
|
||||||
subset of the API. ``fmt::basic_string_view`` is used for format strings even
|
subset of the API. ``fmt::basic_string_view`` is used for format strings even
|
||||||
@ -486,15 +490,14 @@ template <typename Char> class basic_string_view {
|
|||||||
? std::strlen(reinterpret_cast<const char*>(s))
|
? std::strlen(reinterpret_cast<const char*>(s))
|
||||||
: detail::length(s)) {}
|
: detail::length(s)) {}
|
||||||
|
|
||||||
/** Constructs a string reference from a ``std::basic_string`` object. */
|
/**
|
||||||
template <typename Traits, typename Alloc>
|
Constructs a string reference from a ``std::basic_string`` or a
|
||||||
FMT_CONSTEXPR basic_string_view(
|
``std::basic_string_view`` object.
|
||||||
const std::basic_string<Char, Traits, Alloc>& s) noexcept
|
*/
|
||||||
: data_(s.data()), size_(s.size()) {}
|
template <typename S,
|
||||||
|
FMT_ENABLE_IF(detail::is_string_like<S>::value&& std::is_same<
|
||||||
template <typename S, FMT_ENABLE_IF(std::is_same<
|
typename S::value_type, Char>::value)>
|
||||||
S, detail::std_string_view<Char>>::value)>
|
FMT_CONSTEXPR basic_string_view(const S& s) noexcept
|
||||||
FMT_CONSTEXPR basic_string_view(S s) noexcept
|
|
||||||
: data_(s.data()), size_(s.size()) {}
|
: data_(s.data()), size_(s.size()) {}
|
||||||
|
|
||||||
/** Returns a pointer to the string data. */
|
/** Returns a pointer to the string data. */
|
||||||
@ -576,21 +579,16 @@ template <typename Char, FMT_ENABLE_IF(is_char<Char>::value)>
|
|||||||
FMT_INLINE auto to_string_view(const Char* s) -> basic_string_view<Char> {
|
FMT_INLINE auto to_string_view(const Char* s) -> basic_string_view<Char> {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
template <typename Char, typename Traits, typename Alloc>
|
template <typename S, FMT_ENABLE_IF(is_string_like<S>::value)>
|
||||||
inline auto to_string_view(const std::basic_string<Char, Traits, Alloc>& s)
|
inline auto to_string_view(const S& s)
|
||||||
-> basic_string_view<Char> {
|
-> basic_string_view<typename S::value_type> {
|
||||||
return s;
|
return s; // std::basic_string[_view]
|
||||||
}
|
}
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
constexpr auto to_string_view(basic_string_view<Char> s)
|
constexpr auto to_string_view(basic_string_view<Char> s)
|
||||||
-> basic_string_view<Char> {
|
-> basic_string_view<Char> {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
template <typename Char,
|
|
||||||
FMT_ENABLE_IF(!std::is_empty<std_string_view<Char>>::value)>
|
|
||||||
inline auto to_string_view(std_string_view<Char> s) -> basic_string_view<Char> {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
template <typename S, FMT_ENABLE_IF(is_compile_string<S>::value)>
|
template <typename S, FMT_ENABLE_IF(is_compile_string<S>::value)>
|
||||||
constexpr auto to_string_view(const S& s)
|
constexpr auto to_string_view(const S& s)
|
||||||
-> basic_string_view<typename S::char_type> {
|
-> basic_string_view<typename S::char_type> {
|
||||||
@ -985,7 +983,7 @@ class iterator_buffer<T*, T, fixed_buffer_traits> final
|
|||||||
: fixed_buffer_traits(n), buffer<T>(grow, out, 0, n), out_(out) {}
|
: fixed_buffer_traits(n), buffer<T>(grow, out, 0, n), out_(out) {}
|
||||||
iterator_buffer(iterator_buffer&& other)
|
iterator_buffer(iterator_buffer&& other)
|
||||||
: fixed_buffer_traits(other),
|
: fixed_buffer_traits(other),
|
||||||
buffer<T>(std::move(other)),
|
buffer<T>(static_cast<iterator_buffer&&>(other)),
|
||||||
out_(other.out_) {
|
out_(other.out_) {
|
||||||
if (this->data() != out_) {
|
if (this->data() != out_) {
|
||||||
this->set(data_, buffer_size);
|
this->set(data_, buffer_size);
|
||||||
@ -1526,16 +1524,6 @@ enum { max_packed_args = 62 / packed_arg_bits };
|
|||||||
enum : unsigned long long { is_unpacked_bit = 1ULL << 63 };
|
enum : unsigned long long { is_unpacked_bit = 1ULL << 63 };
|
||||||
enum : unsigned long long { has_named_args_bit = 1ULL << 62 };
|
enum : unsigned long long { has_named_args_bit = 1ULL << 62 };
|
||||||
|
|
||||||
#if FMT_GCC_VERSION && FMT_GCC_VERSION < 500
|
|
||||||
// A workaround for gcc 4.8 to make void_t work in a SFINAE context.
|
|
||||||
template <typename...> struct void_t_impl {
|
|
||||||
using type = void;
|
|
||||||
};
|
|
||||||
template <typename... T> using void_t = typename void_t_impl<T...>::type;
|
|
||||||
#else
|
|
||||||
template <typename...> using void_t = void;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <typename It, typename T, typename Enable = void>
|
template <typename It, typename T, typename Enable = void>
|
||||||
struct is_output_iterator : std::false_type {};
|
struct is_output_iterator : std::false_type {};
|
||||||
|
|
||||||
@ -2813,7 +2801,7 @@ using format_string = basic_format_string<char, type_identity_t<Args>...>;
|
|||||||
inline auto runtime(string_view s) -> runtime_format_string<> { return {{s}}; }
|
inline auto runtime(string_view s) -> runtime_format_string<> { return {{s}}; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FMT_API auto vformat(string_view fmt, format_args args) -> std::string;
|
FMT_API auto vformat(string_view fmt, format_args args) -> basic_string<char>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\rst
|
\rst
|
||||||
@ -2828,7 +2816,7 @@ FMT_API auto vformat(string_view fmt, format_args args) -> std::string;
|
|||||||
*/
|
*/
|
||||||
template <typename... T>
|
template <typename... T>
|
||||||
FMT_NODISCARD FMT_INLINE auto format(format_string<T...> fmt, T&&... args)
|
FMT_NODISCARD FMT_INLINE auto format(format_string<T...> fmt, T&&... args)
|
||||||
-> std::string {
|
-> basic_string<char> {
|
||||||
return vformat(fmt, fmt::make_format_args(args...));
|
return vformat(fmt, fmt::make_format_args(args...));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +49,16 @@
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
|
// libc++ supports string_view in pre-c++17.
|
||||||
|
#if FMT_HAS_INCLUDE(<string_view>) && \
|
||||||
|
(FMT_CPLUSPLUS >= 201703L || defined(_LIBCPP_VERSION))
|
||||||
|
# include <string_view>
|
||||||
|
# define FMT_USE_STRING_VIEW
|
||||||
|
#elif FMT_HAS_INCLUDE("experimental/string_view") && FMT_CPLUSPLUS >= 201402L
|
||||||
|
# include <experimental/string_view>
|
||||||
|
# define FMT_USE_EXPERIMENTAL_STRING_VIEW
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined __cpp_inline_variables && __cpp_inline_variables >= 201606L
|
#if defined __cpp_inline_variables && __cpp_inline_variables >= 201606L
|
||||||
# define FMT_INLINE_VARIABLE inline
|
# define FMT_INLINE_VARIABLE inline
|
||||||
#else
|
#else
|
||||||
@ -285,6 +295,15 @@ FMT_CONSTEXPR inline void abort_fuzzing_if(bool condition) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FMT_USE_STRING_VIEW)
|
||||||
|
template <typename Char> using std_string_view = std::basic_string_view<Char>;
|
||||||
|
#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW)
|
||||||
|
template <typename Char>
|
||||||
|
using std_string_view = std::experimental::basic_string_view<Char>;
|
||||||
|
#else
|
||||||
|
template <typename T> struct std_string_view {};
|
||||||
|
#endif
|
||||||
|
|
||||||
template <typename CharT, CharT... C> struct string_literal {
|
template <typename CharT, CharT... C> struct string_literal {
|
||||||
static constexpr CharT value[sizeof...(C)] = {C...};
|
static constexpr CharT value[sizeof...(C)] = {C...};
|
||||||
constexpr operator basic_string_view<CharT>() const {
|
constexpr operator basic_string_view<CharT>() const {
|
||||||
|
Reference in New Issue
Block a user