Remove make_arg

This commit is contained in:
Victor Zverovich
2024-09-14 09:18:47 -07:00
parent 2d5e561a6b
commit de28ef5f86
4 changed files with 23 additions and 38 deletions

View File

@ -110,14 +110,14 @@ template <typename Context> class dynamic_format_arg_store {
} }
template <typename T> void emplace_arg(const T& arg) { template <typename T> void emplace_arg(const T& arg) {
data_.emplace_back(detail::make_arg<Context>(arg)); data_.emplace_back(arg);
} }
template <typename T> template <typename T>
void emplace_arg(const detail::named_arg<char_type, T>& arg) { void emplace_arg(const detail::named_arg<char_type, T>& arg) {
if (named_info_.empty()) if (named_info_.empty())
data_.insert(data_.begin(), basic_format_arg<Context>(nullptr, 0)); data_.insert(data_.begin(), basic_format_arg<Context>(nullptr, 0));
data_.emplace_back(detail::make_arg<Context>(detail::unwrap(arg.value))); data_.emplace_back(detail::unwrap(arg.value));
auto pop_one = [](std::vector<basic_format_arg<Context>>* data) { auto pop_one = [](std::vector<basic_format_arg<Context>>* data) {
data->pop_back(); data->pop_back();
}; };

View File

@ -995,12 +995,6 @@ struct is_contiguous<basic_memory_buffer<T, SIZE, Allocator>> : std::true_type {
FMT_END_EXPORT FMT_END_EXPORT
namespace detail { namespace detail {
template <typename Context, typename T>
FMT_CONSTEXPR auto make_arg(T& val) -> basic_format_arg<Context> {
return {arg_mapper<typename Context::char_type>::map(val)};
}
FMT_API auto write_console(int fd, string_view text) -> bool; FMT_API auto write_console(int fd, string_view text) -> bool;
FMT_API void print(FILE*, string_view); FMT_API void print(FILE*, string_view);
} // namespace detail } // namespace detail
@ -1092,7 +1086,7 @@ class loc_value {
public: public:
template <typename T, FMT_ENABLE_IF(!detail::is_float128<T>::value)> template <typename T, FMT_ENABLE_IF(!detail::is_float128<T>::value)>
loc_value(T value) : value_(detail::make_arg<context>(value)) {} loc_value(T value) : value_(value) {}
template <typename T, FMT_ENABLE_IF(detail::is_float128<T>::value)> template <typename T, FMT_ENABLE_IF(detail::is_float128<T>::value)>
loc_value(T) {} loc_value(T) {}

View File

@ -145,25 +145,19 @@ template <typename T, typename Context> class arg_converter {
using target_type = conditional_t<std::is_same<T, void>::value, U, T>; using target_type = conditional_t<std::is_same<T, void>::value, U, T>;
if (const_check(sizeof(target_type) <= sizeof(int))) { if (const_check(sizeof(target_type) <= sizeof(int))) {
// Extra casts are used to silence warnings. // Extra casts are used to silence warnings.
if (is_signed) { using unsigned_type = typename make_unsigned_or_bool<target_type>::type;
auto n = static_cast<int>(static_cast<target_type>(value)); if (is_signed)
arg_ = detail::make_arg<Context>(n); arg_ = static_cast<int>(static_cast<target_type>(value));
} else { else
using unsigned_type = typename make_unsigned_or_bool<target_type>::type; arg_ = static_cast<unsigned>(static_cast<unsigned_type>(value));
auto n = static_cast<unsigned>(static_cast<unsigned_type>(value));
arg_ = detail::make_arg<Context>(n);
}
} else { } else {
if (is_signed) { // glibc's printf doesn't sign extend arguments of smaller types:
// glibc's printf doesn't sign extend arguments of smaller types: // std::printf("%lld", -42); // prints "4294967254"
// std::printf("%lld", -42); // prints "4294967254" // but we don't have to do the same because it's a UB.
// but we don't have to do the same because it's a UB. if (is_signed)
auto n = static_cast<long long>(value); arg_ = static_cast<long long>(value);
arg_ = detail::make_arg<Context>(n); else
} else { arg_ = static_cast<typename make_unsigned_or_bool<U>::type>(value);
auto n = static_cast<typename make_unsigned_or_bool<U>::type>(value);
arg_ = detail::make_arg<Context>(n);
}
} }
} }
@ -190,8 +184,7 @@ template <typename Context> class char_converter {
template <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)> template <typename T, FMT_ENABLE_IF(std::is_integral<T>::value)>
void operator()(T value) { void operator()(T value) {
auto c = static_cast<typename Context::char_type>(value); arg_ = static_cast<typename Context::char_type>(value);
arg_ = detail::make_arg<Context>(c);
} }
template <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)> template <typename T, FMT_ENABLE_IF(!std::is_integral<T>::value)>
@ -471,7 +464,7 @@ void vprintf(buffer<Char>& buf, basic_string_view<Char> format,
auto nul = std::find(str, str_end, Char()); auto nul = std::find(str, str_end, Char());
auto sv = basic_string_view<Char>( auto sv = basic_string_view<Char>(
str, to_unsigned(nul != str_end ? nul - str : specs.precision)); str, to_unsigned(nul != str_end ? nul - str : specs.precision));
arg = make_arg<basic_printf_context<Char>>(sv); arg = sv;
} }
if (specs.alt() && arg.visit(is_zero_int())) specs.clear_alt(); if (specs.alt() && arg.visit(is_zero_int())) specs.clear_alt();
if (specs.fill_unit<Char>() == '0') { if (specs.fill_unit<Char>() == '0') {

View File

@ -342,14 +342,12 @@ VISIT_TYPE(unsigned long, unsigned long long);
#endif #endif
#if FMT_BUILTIN_TYPES #if FMT_BUILTIN_TYPES
# define CHECK_ARG(expected, value) \ # define CHECK_ARG(expected, value) \
{ \ { \
testing::StrictMock<mock_visitor<decltype(expected)>> visitor; \ testing::StrictMock<mock_visitor<decltype(expected)>> visitor; \
EXPECT_CALL(visitor, visit(expected)); \ EXPECT_CALL(visitor, visit(expected)); \
auto var = value; \ auto var = value; \
fmt::basic_format_arg<fmt::format_context>( \ fmt::basic_format_arg<fmt::format_context>(var).visit(visitor); \
fmt::detail::arg_mapper<char>::map(var)) \
.visit(visitor); \
} }
#else #else
# define CHECK_ARG(expected, value) # define CHECK_ARG(expected, value)