mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-31 03:07:36 +02:00
Move FMT_STRING to core
This commit is contained in:
@ -2258,6 +2258,49 @@ void check_format_string(S format_str) {
|
|||||||
(void)invalid_format;
|
(void)invalid_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts string literals to basic_string_view.
|
||||||
|
template <typename Char, size_t N>
|
||||||
|
FMT_CONSTEXPR basic_string_view<Char> compile_string_to_view(
|
||||||
|
const Char (&s)[N]) {
|
||||||
|
// Remove trailing null character if needed. Won't be present if this is used
|
||||||
|
// with raw character array (i.e. not defined as a string).
|
||||||
|
return {s,
|
||||||
|
N - ((std::char_traits<Char>::to_int_type(s[N - 1]) == 0) ? 1 : 0)};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts string_view to basic_string_view.
|
||||||
|
template <typename Char>
|
||||||
|
FMT_CONSTEXPR basic_string_view<Char> compile_string_to_view(
|
||||||
|
const std_string_view<Char>& s) {
|
||||||
|
return {s.data(), s.size()};
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FMT_STRING_IMPL(s, base) \
|
||||||
|
[] { \
|
||||||
|
/* Use the hidden visibility as a workaround for a GCC bug (#1973). */ \
|
||||||
|
/* Use a macro-like name to avoid shadowing warnings. */ \
|
||||||
|
struct FMT_GCC_VISIBILITY_HIDDEN FMT_COMPILE_STRING : base { \
|
||||||
|
using char_type = fmt::remove_cvref_t<decltype(s[0])>; \
|
||||||
|
FMT_MAYBE_UNUSED FMT_CONSTEXPR \
|
||||||
|
operator fmt::basic_string_view<char_type>() const { \
|
||||||
|
return fmt::detail::compile_string_to_view<char_type>(s); \
|
||||||
|
} \
|
||||||
|
}; \
|
||||||
|
return FMT_COMPILE_STRING(); \
|
||||||
|
}()
|
||||||
|
|
||||||
|
/**
|
||||||
|
\rst
|
||||||
|
Constructs a compile-time format string from a string literal *s*.
|
||||||
|
|
||||||
|
**Example**::
|
||||||
|
|
||||||
|
// A compile-time error because 'd' is an invalid specifier for strings.
|
||||||
|
std::string s = fmt::format(FMT_STRING("{:d}"), "foo");
|
||||||
|
\endrst
|
||||||
|
*/
|
||||||
|
#define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::compile_string)
|
||||||
|
|
||||||
template <typename Char, FMT_ENABLE_IF(!std::is_same<Char, char>::value)>
|
template <typename Char, FMT_ENABLE_IF(!std::is_same<Char, char>::value)>
|
||||||
std::basic_string<Char> vformat(
|
std::basic_string<Char> vformat(
|
||||||
basic_string_view<Char> format_str,
|
basic_string_view<Char> format_str,
|
||||||
|
@ -2704,49 +2704,6 @@ struct format_handler : detail::error_handler {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Converts string literals to basic_string_view.
|
|
||||||
template <typename Char, size_t N>
|
|
||||||
FMT_CONSTEXPR basic_string_view<Char> compile_string_to_view(
|
|
||||||
const Char (&s)[N]) {
|
|
||||||
// Remove trailing null character if needed. Won't be present if this is used
|
|
||||||
// with raw character array (i.e. not defined as a string).
|
|
||||||
return {s,
|
|
||||||
N - ((std::char_traits<Char>::to_int_type(s[N - 1]) == 0) ? 1 : 0)};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Converts string_view to basic_string_view.
|
|
||||||
template <typename Char>
|
|
||||||
FMT_CONSTEXPR basic_string_view<Char> compile_string_to_view(
|
|
||||||
const std_string_view<Char>& s) {
|
|
||||||
return {s.data(), s.size()};
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FMT_STRING_IMPL(s, base) \
|
|
||||||
[] { \
|
|
||||||
/* Use the hidden visibility as a workaround for a GCC bug (#1973). */ \
|
|
||||||
/* Use a macro-like name to avoid shadowing warnings. */ \
|
|
||||||
struct FMT_GCC_VISIBILITY_HIDDEN FMT_COMPILE_STRING : base { \
|
|
||||||
using char_type = fmt::remove_cvref_t<decltype(s[0])>; \
|
|
||||||
FMT_MAYBE_UNUSED FMT_CONSTEXPR \
|
|
||||||
operator fmt::basic_string_view<char_type>() const { \
|
|
||||||
return fmt::detail::compile_string_to_view<char_type>(s); \
|
|
||||||
} \
|
|
||||||
}; \
|
|
||||||
return FMT_COMPILE_STRING(); \
|
|
||||||
}()
|
|
||||||
|
|
||||||
/**
|
|
||||||
\rst
|
|
||||||
Constructs a compile-time format string from a string literal *s*.
|
|
||||||
|
|
||||||
**Example**::
|
|
||||||
|
|
||||||
// A compile-time error because 'd' is an invalid specifier for strings.
|
|
||||||
std::string s = fmt::format(FMT_STRING("{:d}"), "foo");
|
|
||||||
\endrst
|
|
||||||
*/
|
|
||||||
#define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::compile_string)
|
|
||||||
|
|
||||||
template <template <typename> class Handler, typename Context>
|
template <template <typename> class Handler, typename Context>
|
||||||
FMT_CONSTEXPR void handle_dynamic_spec(int& value,
|
FMT_CONSTEXPR void handle_dynamic_spec(int& value,
|
||||||
arg_ref<typename Context::char_type> ref,
|
arg_ref<typename Context::char_type> ref,
|
||||||
|
Reference in New Issue
Block a user