Merge more format overloads
This commit is contained in:
parent
4f16409730
commit
35538ca66c
@ -38,7 +38,7 @@ arguments in the resulting string.
|
|||||||
|
|
||||||
.. _format:
|
.. _format:
|
||||||
|
|
||||||
.. doxygenfunction:: format(string_view, const Args&...)
|
.. doxygenfunction:: format(const String&, const Args&...)
|
||||||
.. doxygenfunction:: vformat(string_view, format_args)
|
.. doxygenfunction:: vformat(string_view, format_args)
|
||||||
|
|
||||||
.. _print:
|
.. _print:
|
||||||
|
@ -9,14 +9,13 @@
|
|||||||
#define FMT_CORE_H_
|
#define FMT_CORE_H_
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdio>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
// 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 50100
|
#define FMT_VERSION 50200
|
||||||
|
|
||||||
#ifdef __has_feature
|
#ifdef __has_feature
|
||||||
# define FMT_HAS_FEATURE(x) __has_feature(x)
|
# define FMT_HAS_FEATURE(x) __has_feature(x)
|
||||||
@ -181,13 +180,6 @@
|
|||||||
# define FMT_ASSERT(condition, message) assert((condition) && message)
|
# define FMT_ASSERT(condition, message) assert((condition) && message)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FMT_DELETED = delete
|
|
||||||
|
|
||||||
// A macro to disallow the copy construction and assignment.
|
|
||||||
#define FMT_DISALLOW_COPY_AND_ASSIGN(Type) \
|
|
||||||
Type(const Type &) FMT_DELETED; \
|
|
||||||
void operator=(const Type &) FMT_DELETED
|
|
||||||
|
|
||||||
// libc++ supports string_view in pre-c++17.
|
// libc++ supports string_view in pre-c++17.
|
||||||
#if (FMT_HAS_INCLUDE(<string_view>) && \
|
#if (FMT_HAS_INCLUDE(<string_view>) && \
|
||||||
(__cplusplus > 201402L || defined(_LIBCPP_VERSION))) || \
|
(__cplusplus > 201402L || defined(_LIBCPP_VERSION))) || \
|
||||||
@ -343,7 +335,8 @@ namespace internal {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
class basic_buffer {
|
class basic_buffer {
|
||||||
private:
|
private:
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(basic_buffer);
|
basic_buffer(const basic_buffer &) = delete;
|
||||||
|
void operator=(const basic_buffer &) = delete;
|
||||||
|
|
||||||
T *ptr_;
|
T *ptr_;
|
||||||
std::size_t size_;
|
std::size_t size_;
|
||||||
@ -815,7 +808,8 @@ namespace internal {
|
|||||||
template <typename Context>
|
template <typename Context>
|
||||||
class arg_map {
|
class arg_map {
|
||||||
private:
|
private:
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(arg_map);
|
arg_map(const arg_map &) = delete;
|
||||||
|
void operator=(const arg_map &) = delete;
|
||||||
|
|
||||||
typedef typename Context::char_type char_type;
|
typedef typename Context::char_type char_type;
|
||||||
|
|
||||||
@ -930,7 +924,8 @@ class basic_format_context :
|
|||||||
private:
|
private:
|
||||||
internal::arg_map<basic_format_context> map_;
|
internal::arg_map<basic_format_context> map_;
|
||||||
|
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(basic_format_context);
|
basic_format_context(const basic_format_context &) = delete;
|
||||||
|
void operator=(const basic_format_context &) = delete;
|
||||||
|
|
||||||
typedef internal::context_base<OutputIt, basic_format_context, Char> base;
|
typedef internal::context_base<OutputIt, basic_format_context, Char> base;
|
||||||
typedef typename base::format_arg format_arg;
|
typedef typename base::format_arg format_arg;
|
||||||
@ -1233,7 +1228,7 @@ inline internal::named_arg<T, wchar_t> arg(wstring_view name, const T &arg) {
|
|||||||
// This function template is deleted intentionally to disable nested named
|
// This function template is deleted intentionally to disable nested named
|
||||||
// arguments as in ``format("{}", arg("a", arg("b", 42)))``.
|
// arguments as in ``format("{}", arg("a", arg("b", 42)))``.
|
||||||
template <typename S, typename T, typename Char>
|
template <typename S, typename T, typename Char>
|
||||||
void arg(S, internal::named_arg<T, Char>) FMT_DELETED;
|
void arg(S, internal::named_arg<T, Char>) = delete;
|
||||||
|
|
||||||
#ifndef FMT_EXTENDED_COLORS
|
#ifndef FMT_EXTENDED_COLORS
|
||||||
// color and (v)print_colored are deprecated.
|
// color and (v)print_colored are deprecated.
|
||||||
@ -1252,6 +1247,61 @@ inline void print_colored(color c, wstring_view format_str,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// A base class for compile-time strings. It is defined in the fmt namespace to
|
||||||
|
// make formatting functions visible via ADL, e.g. format(fmt("{}"), 42).
|
||||||
|
struct compile_string {};
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
// If S is a format string type, format_string_traints<S>::char_type gives its
|
||||||
|
// character type.
|
||||||
|
template <typename S, typename Enable = void>
|
||||||
|
struct format_string_traits {
|
||||||
|
private:
|
||||||
|
// Use constructability as a way to detect if format_string_traits is
|
||||||
|
// specialized because other methods are broken on MSVC2013.
|
||||||
|
format_string_traits();
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
struct format_string_traits_base { typedef Char char_type; };
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
struct format_string_traits<Char *> : format_string_traits_base<Char> {};
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
struct format_string_traits<const Char *> : format_string_traits_base<Char> {};
|
||||||
|
|
||||||
|
template <typename Char, std::size_t N>
|
||||||
|
struct format_string_traits<Char[N]> : format_string_traits_base<Char> {};
|
||||||
|
|
||||||
|
template <typename Char, std::size_t N>
|
||||||
|
struct format_string_traits<const Char[N]> : format_string_traits_base<Char> {};
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
struct format_string_traits<std::basic_string<Char>> :
|
||||||
|
format_string_traits_base<Char> {};
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
struct format_string_traits<basic_string_view<Char>> :
|
||||||
|
format_string_traits_base<Char> {};
|
||||||
|
|
||||||
|
template <typename S>
|
||||||
|
struct is_format_string :
|
||||||
|
std::integral_constant<
|
||||||
|
bool, std::is_constructible<format_string_traits<S>>::value> {};
|
||||||
|
|
||||||
|
template <typename S>
|
||||||
|
struct is_compile_string :
|
||||||
|
std::integral_constant<bool, std::is_base_of<compile_string, S>::value> {};
|
||||||
|
|
||||||
|
template <typename... Args, typename S>
|
||||||
|
typename std::enable_if<!is_compile_string<S>::value>::type
|
||||||
|
check_format_string(S) {}
|
||||||
|
template <typename... Args, typename S>
|
||||||
|
typename std::enable_if<is_compile_string<S>::value>::type
|
||||||
|
check_format_string(S);
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
format_context::iterator vformat_to(
|
format_context::iterator vformat_to(
|
||||||
internal::buffer &buf, string_view format_str, format_args args);
|
internal::buffer &buf, string_view format_str, format_args args);
|
||||||
wformat_context::iterator vformat_to(
|
wformat_context::iterator vformat_to(
|
||||||
@ -1292,44 +1342,6 @@ typename std::enable_if<
|
|||||||
std::string vformat(string_view format_str, format_args args);
|
std::string vformat(string_view format_str, format_args args);
|
||||||
std::wstring vformat(wstring_view format_str, wformat_args args);
|
std::wstring vformat(wstring_view format_str, wformat_args args);
|
||||||
|
|
||||||
namespace internal {
|
|
||||||
// If S is a format string type, format_string_traints<S>::char_type gives its
|
|
||||||
// character type.
|
|
||||||
template <typename S>
|
|
||||||
struct format_string_traits {
|
|
||||||
private:
|
|
||||||
// Use construtbility as a way to detect if format_string_traits is
|
|
||||||
// specialized because other methods are broken on MSVC2013.
|
|
||||||
format_string_traits();
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Char>
|
|
||||||
struct format_string_traits_base { typedef Char char_type; };
|
|
||||||
|
|
||||||
template <typename Char>
|
|
||||||
struct format_string_traits<const Char *>: format_string_traits_base<Char> {};
|
|
||||||
|
|
||||||
template <typename Char>
|
|
||||||
struct format_string_traits<Char *>: format_string_traits_base<Char> {};
|
|
||||||
|
|
||||||
template <typename Char>
|
|
||||||
struct format_string_traits<std::basic_string<Char>>:
|
|
||||||
format_string_traits_base<Char> {};
|
|
||||||
|
|
||||||
template <typename Char>
|
|
||||||
struct format_string_traits<basic_string_view<Char>>:
|
|
||||||
format_string_traits_base<Char> {};
|
|
||||||
|
|
||||||
template <typename S>
|
|
||||||
struct is_format_string:
|
|
||||||
std::integral_constant<
|
|
||||||
bool, std::is_constructible<format_string_traits<S>>::value> {};
|
|
||||||
|
|
||||||
template <typename... Args, typename S>
|
|
||||||
typename std::enable_if<is_format_string<S>::value>::type
|
|
||||||
check_format_string(S) {}
|
|
||||||
} // namespace internal
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\rst
|
\rst
|
||||||
Formats arguments and returns the result as a string.
|
Formats arguments and returns the result as a string.
|
||||||
@ -1343,15 +1355,15 @@ typename std::enable_if<is_format_string<S>::value>::type
|
|||||||
template <typename String, typename... Args>
|
template <typename String, typename... Args>
|
||||||
inline std::basic_string<
|
inline std::basic_string<
|
||||||
typename internal::format_string_traits<String>::char_type>
|
typename internal::format_string_traits<String>::char_type>
|
||||||
format(String format_str, const Args & ... args) {
|
format(const String &format_str, const Args & ... args) {
|
||||||
typedef typename internal::format_string_traits<String>::char_type char_type;
|
typedef typename internal::format_string_traits<String>::char_type char_type;
|
||||||
internal::check_format_string<Args...>(format_str);
|
internal::check_format_string<Args...>(format_str);
|
||||||
// This should be just
|
// This should be just
|
||||||
// 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 buffer_context<char_type>::type context_type;
|
typedef typename buffer_context<char_type>::type context_type;
|
||||||
format_arg_store<context_type, Args...> as{args...};
|
format_arg_store<context_type, Args...> as{args...};
|
||||||
return vformat(format_str, as);
|
return vformat(basic_string_view<char_type>(format_str), 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);
|
||||||
|
@ -1352,10 +1352,13 @@ FMT_CONSTEXPR unsigned basic_parse_context<Char, ErrorHandler>::next_arg_id() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct compile_string {};
|
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
template <typename S>
|
||||||
|
struct format_string_traits<
|
||||||
|
S, typename std::enable_if<std::is_base_of<compile_string, S>::value>::type>:
|
||||||
|
format_string_traits_base<char> {};
|
||||||
|
|
||||||
template <typename Char, typename Handler>
|
template <typename Char, typename Handler>
|
||||||
FMT_CONSTEXPR void handle_int_type_spec(Char spec, Handler &&handler) {
|
FMT_CONSTEXPR void handle_int_type_spec(Char spec, Handler &&handler) {
|
||||||
switch (spec) {
|
switch (spec) {
|
||||||
@ -1536,8 +1539,6 @@ class arg_formatter_base {
|
|||||||
writer_type writer_;
|
writer_type writer_;
|
||||||
format_specs &specs_;
|
format_specs &specs_;
|
||||||
|
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(arg_formatter_base);
|
|
||||||
|
|
||||||
struct char_writer {
|
struct char_writer {
|
||||||
char_type value;
|
char_type value;
|
||||||
template <typename It>
|
template <typename It>
|
||||||
@ -1645,10 +1646,6 @@ class arg_formatter_base {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename S>
|
|
||||||
struct is_compile_string:
|
|
||||||
std::integral_constant<bool, std::is_base_of<compile_string, S>::value> {};
|
|
||||||
|
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
FMT_CONSTEXPR bool is_name_start(Char c) {
|
FMT_CONSTEXPR bool is_name_start(Char c) {
|
||||||
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c;
|
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c;
|
||||||
@ -2464,13 +2461,9 @@ class basic_writer {
|
|||||||
typedef basic_format_specs<char_type> format_specs;
|
typedef basic_format_specs<char_type> format_specs;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Output iterator.
|
iterator out_; // Output iterator.
|
||||||
iterator out_;
|
|
||||||
|
|
||||||
std::unique_ptr<locale_provider> locale_;
|
std::unique_ptr<locale_provider> locale_;
|
||||||
|
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(basic_writer);
|
|
||||||
|
|
||||||
iterator out() const { return out_; }
|
iterator out() const { return out_; }
|
||||||
|
|
||||||
// Attempts to reserve space for n extra characters in the output range.
|
// Attempts to reserve space for n extra characters in the output range.
|
||||||
@ -3677,14 +3670,6 @@ inline std::wstring vformat(wstring_view format_str, wformat_args args) {
|
|||||||
return to_string(buffer);
|
return to_string(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename String, typename... Args>
|
|
||||||
inline typename std::enable_if<
|
|
||||||
internal::is_compile_string<String>::value, std::string>::type
|
|
||||||
format(String format_str, const Args & ... args) {
|
|
||||||
internal::check_format_string<Args...>(format_str);
|
|
||||||
return vformat(format_str.data(), make_format_args(args...));
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
||||||
@ -3983,6 +3968,7 @@ FMT_END_NAMESPACE
|
|||||||
struct S : fmt::compile_string { \
|
struct S : fmt::compile_string { \
|
||||||
static FMT_CONSTEXPR pointer data() { return s; } \
|
static FMT_CONSTEXPR pointer data() { return s; } \
|
||||||
static FMT_CONSTEXPR size_t size() { return sizeof(s); } \
|
static FMT_CONSTEXPR size_t size() { return sizeof(s); } \
|
||||||
|
explicit operator fmt::string_view() const { return s; } \
|
||||||
}; \
|
}; \
|
||||||
return S{}; \
|
return S{}; \
|
||||||
}()
|
}()
|
||||||
|
@ -184,7 +184,9 @@ public:
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
private:
|
private:
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(buffered_file);
|
buffered_file(const buffered_file &) = delete;
|
||||||
|
void operator=(const buffered_file &) = delete;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
buffered_file(buffered_file &&other) FMT_NOEXCEPT : file_(other.file_) {
|
buffered_file(buffered_file &&other) FMT_NOEXCEPT : file_(other.file_) {
|
||||||
@ -294,7 +296,8 @@ class file {
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
private:
|
private:
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(file);
|
file(const file &) = delete;
|
||||||
|
void operator=(const file &) = delete;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
file(file &&other) FMT_NOEXCEPT : fd_(other.fd_) {
|
file(file &&other) FMT_NOEXCEPT : fd_(other.fd_) {
|
||||||
@ -381,7 +384,8 @@ class Locale {
|
|||||||
|
|
||||||
locale_t locale_;
|
locale_t locale_;
|
||||||
|
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(Locale);
|
Locale(const Locale &) = delete;
|
||||||
|
void operator=(const Locale &) = delete;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef locale_t Type;
|
typedef locale_t Type;
|
||||||
|
@ -142,8 +142,6 @@ class char_converter: public function<void> {
|
|||||||
private:
|
private:
|
||||||
basic_format_arg<Context> &arg_;
|
basic_format_arg<Context> &arg_;
|
||||||
|
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(char_converter);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit char_converter(basic_format_arg<Context> &arg) : arg_(arg) {}
|
explicit char_converter(basic_format_arg<Context> &arg) : arg_(arg) {}
|
||||||
|
|
||||||
@ -169,8 +167,6 @@ class printf_width_handler: public function<unsigned> {
|
|||||||
|
|
||||||
format_specs &spec_;
|
format_specs &spec_;
|
||||||
|
|
||||||
FMT_DISALLOW_COPY_AND_ASSIGN(printf_width_handler);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit printf_width_handler(format_specs &spec) : spec_(spec) {}
|
explicit printf_width_handler(format_specs &spec) : spec_(spec) {}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user