12 # include <functional> 22 template <
typename T>
struct is_reference_wrapper : std::false_type {};
24 struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type {};
26 template <
typename T>
auto unwrap(
const T& v) ->
const T& {
return v; }
28 auto unwrap(
const std::reference_wrapper<T>& v) ->
const T& {
29 return static_cast<const T&
>(v);
38 template <
typename =
void>
struct node {
39 virtual ~node() =
default;
40 std::unique_ptr<node<>>
next;
43 class dynamic_arg_list {
44 template <
typename T>
struct typed_node : node<> {
47 template <
typename Arg>
48 FMT_CONSTEXPR typed_node(
const Arg& arg) : value(arg) {}
50 template <
typename Char>
55 std::unique_ptr<node<>> head_;
58 template <
typename T,
typename Arg>
auto push(
const Arg& arg) ->
const T& {
59 auto new_node = std::unique_ptr<typed_node<T>>(
new typed_node<T>(arg));
60 auto& value = new_node->value;
61 new_node->next = std::move(head_);
62 head_ = std::move(new_node);
76 using char_type =
typename Context::char_type;
78 template <
typename T>
struct need_copy {
79 static constexpr detail::type mapped_type =
80 detail::mapped_type_constant<T, char_type>::value;
83 value = !(detail::is_reference_wrapper<T>::value ||
84 std::is_same<T, basic_string_view<char_type>>::value ||
85 std::is_same<T, detail::std_string_view<char_type>>::value ||
86 (mapped_type != detail::type::cstring_type &&
87 mapped_type != detail::type::string_type &&
88 mapped_type != detail::type::custom_type))
93 using stored_t = conditional_t<
94 std::is_convertible<T, std::basic_string<char_type>>::value &&
95 !detail::is_reference_wrapper<T>::value,
96 std::basic_string<char_type>, T>;
99 std::vector<basic_format_arg<Context>> data_;
100 std::vector<detail::named_arg_info<char_type>> named_info_;
104 detail::dynamic_arg_list dynamic_args_;
108 auto data()
const ->
const basic_format_arg<Context>* {
109 return named_info_.empty() ? data_.data() : data_.data() + 1;
112 template <
typename T>
void emplace_arg(
const T& arg) {
113 data_.emplace_back(arg);
116 template <
typename T>
117 void emplace_arg(
const detail::named_arg<char_type, T>& arg) {
118 if (named_info_.empty())
119 data_.insert(data_.begin(), basic_format_arg<Context>(
nullptr, 0));
120 data_.emplace_back(detail::unwrap(arg.value));
121 auto pop_one = [](std::vector<basic_format_arg<Context>>* data) {
124 std::unique_ptr<std::vector<basic_format_arg<Context>>, decltype(pop_one)>
125 guard{&data_, pop_one};
126 named_info_.push_back({arg.name,
static_cast<int>(data_.size() - 2u)});
127 data_[0] = {named_info_.data(), named_info_.size()};
136 !named_info_.empty());
155 if (detail::const_check(need_copy<T>::value))
156 emplace_arg(dynamic_args_.push<stored_t<T>>(arg));
158 emplace_arg(detail::unwrap(arg));
174 template <
typename T>
void push_back(std::reference_wrapper<T> arg) {
177 "objects of built-in types and string views are always copied");
178 emplace_arg(arg.get());
186 template <
typename T>
187 void push_back(
const detail::named_arg<char_type, T>& arg) {
188 const char_type* arg_name =
189 dynamic_args_.push<std::basic_string<char_type>>(arg.name).c_str();
190 if (detail::const_check(need_copy<T>::value)) {
192 fmt::arg(arg_name, dynamic_args_.push<stored_t<T>>(arg.value)));
194 emplace_arg(fmt::arg(arg_name, arg.value));
207 void reserve(
size_t new_cap,
size_t new_cap_named) {
208 FMT_ASSERT(new_cap >= new_cap_named,
209 "set of arguments includes set of named arguments");
210 data_.reserve(new_cap);
211 named_info_.reserve(new_cap_named);
215 auto size() const noexcept ->
size_t {
return data_.size(); }
220 #endif // FMT_ARGS_H_
constexpr auto data() const noexcept -> const Char *
Returns a pointer to the string data.
Definition: base.h:557
constexpr auto size() const noexcept -> size_t
Returns the string size.
Definition: base.h:560
Converts a string literal into a format string that will be parsed at compile time and converted into...
Definition: args.h:20
An implementation of std::basic_string_view for pre-C++17.
Definition: base.h:515
bool next(BasicCoordinate< num_dimensions, int > &indices, const Array< num_dimensions2, T > &a)
Given an index into an array, increment it to the next one.
Definition: array_index_functions.inl:107