26template <
typename T>
auto unwrap(
const T& v) ->
const T& {
return v; }
28auto unwrap(
const std::reference_wrapper<T>& v) ->
const T& {
29 return static_cast<const T&
>(v);
38template <
typename =
void>
struct node {
40 std::unique_ptr<node<>>
next;
44 template <
typename T>
struct typed_node :
node<> {
47 template <
typename 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));
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 {
84 std::is_same<T, basic_string_view<char_type>>::value ||
85 std::is_same<T, detail::std_string_view<char_type>>::value ||
94 std::is_convertible<T, std::basic_string<char_type>>::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_;
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>
118 if (named_info_.empty())
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());
156 emplace_arg(dynamic_args_.
push<stored_t<T>>(
arg));
177 "objects of built-in types and string views are always copied");
178 emplace_arg(
arg.get());
186 template <
typename T>
188 const char_type* arg_name =
189 dynamic_args_.
push<std::basic_string<char_type>>(
arg.name).c_str();
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) {
209 "set of arguments includes set of named arguments");
210 data_.reserve(new_cap);
211 named_info_.reserve(new_cap_named);
215 size_t size() const noexcept {
return data_.size(); }
An implementation of std::basic_string_view for pre-C++17.
Definition base.h:504
auto push(const Arg &arg) -> const T &
Definition args.h:58
constexpr FMT_INLINE value()
Definition base.h:2104
detail namespace with internal helper functions
Definition input_adapters.h:32
@ value
the parser finished reading a JSON value
FMT_ALWAYS_INLINE constexpr auto const_check(T val) -> T
Definition base.h:367
auto unwrap(const T &v) -> const T &
Definition args.h:26
type
Definition base.h:937
Implement std::hash so that hash_code can be used in STL containers.
Definition PointerIntPair.h:280
std::unique_ptr< node<> > next
Definition args.h:40
#define FMT_ASSERT(condition, message)
Definition base.h:381
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
Returns a named argument to be used in a formatting function.
Definition base.h:2775
#define FMT_CONSTEXPR
Definition base.h:113
#define FMT_BEGIN_NAMESPACE
Definition base.h:239
typename std::conditional< B, T, F >::type conditional_t
Definition base.h:299
#define FMT_END_NAMESPACE
Definition base.h:242