Specialize formatter for all std::basic_string types (#3943)

* Specialize `formatter` for all `std::basic_string` types

* mock-allocator: add member types to make GCC 4.8 happy
This commit is contained in:
Diego Ramírez 2024-04-23 08:44:41 -07:00 committed by GitHub
parent 400f6a8ee2
commit cf1f55f798
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 26 additions and 7 deletions

View File

@ -4017,11 +4017,14 @@ FMT_FORMAT_AS(unsigned short, unsigned);
FMT_FORMAT_AS(long, detail::long_type); FMT_FORMAT_AS(long, detail::long_type);
FMT_FORMAT_AS(unsigned long, detail::ulong_type); FMT_FORMAT_AS(unsigned long, detail::ulong_type);
FMT_FORMAT_AS(Char*, const Char*); FMT_FORMAT_AS(Char*, const Char*);
FMT_FORMAT_AS(std::basic_string<Char>, basic_string_view<Char>);
FMT_FORMAT_AS(std::nullptr_t, const void*); FMT_FORMAT_AS(std::nullptr_t, const void*);
FMT_FORMAT_AS(detail::std_string_view<Char>, basic_string_view<Char>); FMT_FORMAT_AS(detail::std_string_view<Char>, basic_string_view<Char>);
FMT_FORMAT_AS(void*, const void*); FMT_FORMAT_AS(void*, const void*);
template <typename Char, typename Traits, typename Allocator>
class formatter<std::basic_string<Char, Traits, Allocator>, Char>
: public formatter<basic_string_view<Char>, Char> {};
template <typename Char, size_t N> template <typename Char, size_t N>
struct formatter<Char[N], Char> : formatter<basic_string_view<Char>, Char> {}; struct formatter<Char[N], Char> : formatter<basic_string_view<Char>, Char> {};

View File

@ -22,6 +22,7 @@
#include <iterator> // std::back_inserter #include <iterator> // std::back_inserter
#include <list> // std::list #include <list> // std::list
#include <mutex> // std::mutex #include <mutex> // std::mutex
#include <string> // std::string
#include <thread> // std::thread #include <thread> // std::thread
#include <type_traits> // std::is_default_constructible #include <type_traits> // std::is_default_constructible
@ -2222,16 +2223,21 @@ template <typename Char, typename... T> void check_enabled_formatters() {
} }
TEST(format_test, test_formatters_enabled) { TEST(format_test, test_formatters_enabled) {
using custom_string =
std::basic_string<char, std::char_traits<char>, mock_allocator<char>>;
using custom_wstring = std::basic_string<wchar_t, std::char_traits<wchar_t>,
mock_allocator<wchar_t>>;
check_enabled_formatters<char, bool, char, signed char, unsigned char, short, check_enabled_formatters<char, bool, char, signed char, unsigned char, short,
unsigned short, int, unsigned, long, unsigned long, unsigned short, int, unsigned, long, unsigned long,
long long, unsigned long long, float, double, long long, unsigned long long, float, double,
long double, void*, const void*, char*, const char*, long double, void*, const void*, char*, const char*,
std::string, std::nullptr_t>(); std::string, custom_string, std::nullptr_t>();
check_enabled_formatters<wchar_t, bool, wchar_t, signed char, unsigned char, check_enabled_formatters<
short, unsigned short, int, unsigned, long, wchar_t, bool, wchar_t, signed char, unsigned char, short, unsigned short,
unsigned long, long long, unsigned long long, float, int, unsigned, long, unsigned long, long long, unsigned long long, float,
double, long double, void*, const void*, wchar_t*, double, long double, void*, const void*, wchar_t*, const wchar_t*,
const wchar_t*, std::wstring, std::nullptr_t>(); std::wstring, custom_wstring, std::nullptr_t>();
} }
TEST(format_int_test, data) { TEST(format_int_test, data) {

View File

@ -20,6 +20,16 @@ template <typename T> class mock_allocator {
using value_type = T; using value_type = T;
using size_type = size_t; using size_type = size_t;
using pointer = T*;
using const_pointer = const T*;
using reference = T&;
using const_reference = const T&;
using difference_type = ptrdiff_t;
template <typename U> struct rebind {
using other = mock_allocator<U>;
};
mock_allocator() {} mock_allocator() {}
mock_allocator(const mock_allocator&) {} mock_allocator(const mock_allocator&) {}