mirror of
https://github.com/fmtlib/fmt.git
synced 2025-04-07 10:20:58 +00:00
Parameterize vformat to support custom char types
This commit is contained in:
parent
c68bab7014
commit
4061a0d35d
@ -1281,9 +1281,11 @@ template <typename Char>
|
|||||||
struct format_string_traits<std::basic_string<Char>> :
|
struct format_string_traits<std::basic_string<Char>> :
|
||||||
format_string_traits_base<Char> {};
|
format_string_traits_base<Char> {};
|
||||||
|
|
||||||
template <typename Char>
|
template <typename S>
|
||||||
struct format_string_traits<basic_string_view<Char>> :
|
struct format_string_traits<
|
||||||
format_string_traits_base<Char> {};
|
S, typename std::enable_if<std::is_base_of<
|
||||||
|
basic_string_view<typename S::char_type>, S>::value>::type> :
|
||||||
|
format_string_traits_base<typename S::char_type> {};
|
||||||
|
|
||||||
template <typename S>
|
template <typename S>
|
||||||
struct is_format_string :
|
struct is_format_string :
|
||||||
@ -1300,6 +1302,11 @@ typename std::enable_if<!is_compile_string<S>::value>::type
|
|||||||
template <typename... Args, typename S>
|
template <typename... Args, typename S>
|
||||||
typename std::enable_if<is_compile_string<S>::value>::type
|
typename std::enable_if<is_compile_string<S>::value>::type
|
||||||
check_format_string(S);
|
check_format_string(S);
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
std::basic_string<Char> vformat(
|
||||||
|
basic_string_view<Char> format_str,
|
||||||
|
basic_format_args<typename buffer_context<Char>::type> args);
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
format_context::iterator vformat_to(
|
format_context::iterator vformat_to(
|
||||||
@ -1354,8 +1361,15 @@ inline typename std::enable_if<
|
|||||||
make_format_args<wformat_context>(args...));
|
make_format_args<wformat_context>(args...));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string vformat(string_view format_str, format_args args);
|
template <
|
||||||
std::wstring vformat(wstring_view format_str, wformat_args args);
|
typename String,
|
||||||
|
typename Char = typename internal::format_string_traits<String>::char_type>
|
||||||
|
inline std::basic_string<Char> vformat(
|
||||||
|
const String &format_str,
|
||||||
|
basic_format_args<typename buffer_context<Char>::type> args) {
|
||||||
|
// Convert format string to string_view to reduce the number of overloads.
|
||||||
|
return internal::vformat(basic_string_view<Char>(format_str), args);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\rst
|
\rst
|
||||||
@ -1376,8 +1390,11 @@ inline std::basic_string<
|
|||||||
// return vformat(format_str, make_format_args(args...));
|
// return vformat(format_str, make_format_args(args...));
|
||||||
// but gcc has trouble optimizing the latter, so break it down.
|
// but gcc has trouble optimizing the latter, so break it down.
|
||||||
typedef typename internal::format_string_traits<String>::char_type char_t;
|
typedef typename internal::format_string_traits<String>::char_type char_t;
|
||||||
format_arg_store<typename buffer_context<char_t>::type, Args...> as{args...};
|
typedef typename buffer_context<char_t>::type context_t;
|
||||||
return vformat(basic_string_view<char_t>(format_str), as);
|
format_arg_store<context_t, Args...> as{args...};
|
||||||
|
return internal::vformat(
|
||||||
|
basic_string_view<char_t>(format_str),
|
||||||
|
basic_format_args<context_t>(as));
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_API void vprint(std::FILE *f, string_view format_str, format_args args);
|
FMT_API void vprint(std::FILE *f, string_view format_str, format_args args);
|
||||||
|
@ -490,13 +490,14 @@ struct char8_t {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// A UTF-8 string.
|
// A UTF-8 string view.
|
||||||
class u8string_view : public basic_string_view<char8_t> {
|
class u8string_view : public basic_string_view<char8_t> {
|
||||||
private:
|
private:
|
||||||
typedef basic_string_view<char8_t> base;
|
typedef basic_string_view<char8_t> base;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using basic_string_view::basic_string_view;
|
using basic_string_view::basic_string_view;
|
||||||
|
using basic_string_view::char_type;
|
||||||
|
|
||||||
u8string_view(const char *s)
|
u8string_view(const char *s)
|
||||||
: base(reinterpret_cast<const char8_t*>(s)) {}
|
: base(reinterpret_cast<const char8_t*>(s)) {}
|
||||||
@ -3617,18 +3618,15 @@ inline format_to_n_result<OutputIt> format_to_n(
|
|||||||
return {it.base(), it.count()};
|
return {it.base(), it.count()};
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string vformat(string_view format_str, format_args args) {
|
template <typename Char>
|
||||||
memory_buffer buffer;
|
inline std::basic_string<Char> internal::vformat(
|
||||||
|
basic_string_view<Char> format_str,
|
||||||
|
basic_format_args<typename buffer_context<Char>::type> args) {
|
||||||
|
basic_memory_buffer<Char> buffer;
|
||||||
vformat_to(buffer, format_str, args);
|
vformat_to(buffer, format_str, args);
|
||||||
return fmt::to_string(buffer);
|
return fmt::to_string(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::wstring vformat(wstring_view format_str, wformat_args args) {
|
|
||||||
wmemory_buffer buffer;
|
|
||||||
vformat_to(buffer, format_str, args);
|
|
||||||
return to_string(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename String, typename... Args>
|
template <typename String, typename... Args>
|
||||||
inline typename std::enable_if<internal::is_compile_string<String>::value>::type
|
inline typename std::enable_if<internal::is_compile_string<String>::value>::type
|
||||||
print(String format_str, const Args & ... args) {
|
print(String format_str, const Args & ... args) {
|
||||||
|
@ -8,12 +8,6 @@
|
|||||||
#include "fmt/format-inl.h"
|
#include "fmt/format-inl.h"
|
||||||
|
|
||||||
FMT_BEGIN_NAMESPACE
|
FMT_BEGIN_NAMESPACE
|
||||||
namespace internal {
|
|
||||||
// Force linking of inline functions into the library.
|
|
||||||
std::string (*vformat_ref)(string_view, format_args) = vformat;
|
|
||||||
std::wstring (*vformat_wref)(wstring_view, wformat_args) = vformat;
|
|
||||||
}
|
|
||||||
|
|
||||||
template struct internal::basic_data<void>;
|
template struct internal::basic_data<void>;
|
||||||
|
|
||||||
// Explicit instantiations for char.
|
// Explicit instantiations for char.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user