25 template <
typename T>
const T&
unwrap(
const T& v) {
return v; }
26 template <
typename T>
const T&
unwrap(
const std::reference_wrapper<T>& v) {
27 return static_cast<const T&
>(v);
34 template <
typename =
void>
struct node {
35 virtual ~
node() =
default;
36 std::unique_ptr<node<>>
next;
42 template <
typename Arg>
45 template <
typename Char>
53 template <
typename T,
typename Arg>
const T&
push(
const Arg&
arg) {
73 template <
typename Context>
84 static constexpr detail::type mapped_type =
85 detail::mapped_type_constant<T, Context>::value;
89 std::is_same<T, basic_string_view<char_type>>
::value ||
90 std::is_same<T, detail::std_string_view<char_type>>
::value ||
91 (mapped_type != detail::type::cstring_type &&
92 mapped_type != detail::type::string_type &&
93 mapped_type != detail::type::custom_type))
101 std::basic_string<char_type>, T>;
104 std::vector<basic_format_arg<Context>>
data_;
121 return named_info_.empty() ? data_.data() : data_.data() + 1;
125 data_.emplace_back(detail::make_arg<Context>(arg));
128 template <
typename T>
130 if (named_info_.empty()) {
131 constexpr
const detail::named_arg_info<char_type>* zero_ptr{
nullptr};
132 data_.insert(data_.begin(), {zero_ptr, 0});
134 data_.emplace_back(detail::make_arg<Context>(
detail::unwrap(arg.value)));
135 auto pop_one = [](std::vector<basic_format_arg<Context>>*
data) {
138 std::unique_ptr<std::vector<basic_format_arg<Context>>, decltype(pop_one)>
139 guard{&data_, pop_one};
140 named_info_.push_back({arg.name,
static_cast<int>(data_.size() - 2u)});
141 data_[0].value_.named_args = {named_info_.data(), named_info_.size()};
188 "objects of built-in types and string views are always copied");
189 emplace_arg(arg.get());
197 template <
typename T>
200 dynamic_args_.
push<std::basic_string<char_type>>(arg.name).c_str();
205 emplace_arg(
fmt::arg(arg_name, arg.value));
222 void reserve(
size_t new_cap,
size_t new_cap_named) {
224 "Set of arguments includes set of named arguments");
225 data_.reserve(new_cap);
226 named_info_.reserve(new_cap_named);
232 #endif // FMT_ARGS_H_
std::unique_ptr< node<> > head_
const T & push(const Arg &arg)
FMT_CONSTEXPR typed_node(const Arg &arg)
typename std::conditional< B, T, F >::type conditional_t
constexpr auto const_check(T value) -> T
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
#define FMT_END_NAMESPACE
integral_constant< bool, false > false_type
integral_constant< bool, true > true_type
FMT_CONSTEXPR typed_node(const basic_string_view< Char > &arg)
const T & move(const T &v)
std::unique_ptr< node<> > next
span_constexpr std::size_t size(span< T, Extent > const &spn)
#define FMT_ASSERT(condition, message)
#define FMT_BEGIN_NAMESPACE
const T & unwrap(const T &v)
constexpr FMT_INLINE value()
std::is_constructible< typename Context::template formatter_type< T > > has_formatter