From 963ee0831049b2e07d2b37e975a4b974a437749f Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Sat, 9 May 2020 16:38:37 -0700 Subject: [PATCH] Simplify named arguments --- include/fmt/core.h | 54 ++++++++++++-------------------------------- include/fmt/format.h | 2 +- 2 files changed, 15 insertions(+), 41 deletions(-) diff --git a/include/fmt/core.h b/include/fmt/core.h index 15364f5d..a892f75e 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -747,8 +747,14 @@ template using has_fallback_formatter = std::is_constructible>; -template struct named_arg_base; -template struct named_arg; +struct view {}; + +template +struct named_arg : view { + const Char* name; + const T& value; + named_arg(const Char* n, const T& v) : name(n), value(v) {} +}; template struct named_arg_info { const Char* name; @@ -789,7 +795,7 @@ void init_named_args(named_arg_info* named_args, int arg_count, template void init_named_args(named_arg_info* named_args, int arg_count, - int named_arg_count, const named_arg& arg, + int named_arg_count, const named_arg& arg, const Tail&... args) { named_args[named_arg_count++] = {arg.name, arg_count}; init_named_args(named_args, arg_count + 1, named_arg_count, args...); @@ -801,7 +807,7 @@ FMT_INLINE void init_named_args(std::nullptr_t, int, int, const Args&...) {} template struct is_named_arg : std::false_type {}; template -struct is_named_arg> : std::true_type {}; +struct is_named_arg> : std::true_type {}; template constexpr size_t count() { return B ? 1 : 0; } template constexpr size_t count() { @@ -903,7 +909,6 @@ template class value { const void* pointer; string_value string; custom_value custom; - const named_arg_base* named_arg; // DEPRECATED named_arg_value named_args; }; @@ -1062,7 +1067,7 @@ template struct arg_mapper { } template - FMT_CONSTEXPR auto map(const named_arg& val) + FMT_CONSTEXPR auto map(const named_arg& val) -> decltype(std::declval().map(val.value)) { return map(val.value); } @@ -1403,34 +1408,6 @@ inline format_arg_store make_format_args( return {args...}; } -namespace internal { -template struct named_arg_base { - const Char* name; - - // Serialized value. - mutable char data[sizeof(basic_format_arg>)]; - - named_arg_base(const Char* nm) : name(nm) {} - - template basic_format_arg deserialize() const { - basic_format_arg arg; - std::memcpy(&arg, data, sizeof(basic_format_arg)); - return arg; - } -}; - -struct view {}; - -template -struct named_arg : view, named_arg_base { - const T& value; - - named_arg(const Char* name, const T& val) - : named_arg_base(name), value(val) {} -}; - -} // namespace internal - /** \rst Returns a named argument to be used in a formatting function. It should only @@ -1442,7 +1419,7 @@ struct named_arg : view, named_arg_base { \endrst */ template -inline internal::named_arg arg(const Char* name, const T& arg) { +inline internal::named_arg arg(const Char* name, const T& arg) { static_assert(!internal::is_named_arg(), "nested named arguments"); return {name, arg}; } @@ -1511,7 +1488,7 @@ class dynamic_format_arg_store } template - void emplace_arg(const internal::named_arg& arg) { + void emplace_arg(const internal::named_arg& arg) { if (named_info_.empty()) { constexpr const internal::named_arg_info* zero_ptr{nullptr}; data_.insert(data_.begin(), {zero_ptr, 0}); @@ -1547,9 +1524,6 @@ class dynamic_format_arg_store \endrst */ template void push_back(const T& arg) { - static_assert( - !std::is_base_of, T>::value, - "named arguments are not supported yet"); if (internal::const_check(need_copy::value)) emplace_arg(dynamic_args_.push>(arg)); else @@ -1591,7 +1565,7 @@ class dynamic_format_arg_store argument. */ template - void push_back(const internal::named_arg& arg) { + void push_back(const internal::named_arg& arg) { const char_type* arg_name = dynamic_args_.push>(arg.name).c_str(); if (internal::const_check(need_copy::value)) { diff --git a/include/fmt/format.h b/include/fmt/format.h index 2592bff1..b2d1c02c 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -3515,7 +3515,7 @@ template struct udl_formatter { template struct udl_arg { const Char* str; - template named_arg operator=(T&& value) const { + template named_arg operator=(T&& value) const { return {str, std::forward(value)}; } };