Skip to content

Commit

Permalink
Add support for dynamic arg sets
Browse files Browse the repository at this point in the history
This allows construction of basic_format_args from a dynamic set of arguments. The syntax is a little clunky and could probably be improved but this at least enables the functionality.
  • Loading branch information
MikePopoloski authored and vitaut committed Jul 21, 2018
1 parent cf2719b commit b1d10a2
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
10 changes: 10 additions & 0 deletions include/fmt/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -1145,6 +1145,16 @@ class basic_format_args {
set_data(store.data_);
}

/**
\rst
Constructs a `basic_format_args` object from a dynamic set of arguments.
\endrst
*/
basic_format_args(const format_arg *args, size_type count)
: types_(-(int64_t)count) {
set_data(args);
}

/** Returns the argument at specified index. */
format_arg get(size_type index) const {
format_arg arg = do_get(index);
Expand Down
11 changes: 11 additions & 0 deletions test/format-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1316,6 +1316,17 @@ TEST(FormatTest, Variadic) {
EXPECT_EQ(L"abc1", format(L"{}c{}", L"ab", 1));
}

TEST(FormatTest, Dynamic) {
using ctx = fmt::format_context;
std::vector<fmt::basic_format_arg<ctx>> args;
args.emplace_back(fmt::internal::make_arg<ctx>(42));
args.emplace_back(fmt::internal::make_arg<ctx>("abc1"));
args.emplace_back(fmt::internal::make_arg<ctx>(1.2f));

std::string result = fmt::vformat("{} and {} and {}", fmt::basic_format_args<ctx>(args.data(), (unsigned)args.size()));
EXPECT_EQ("42 and abc1 and 1.2", result);
}

TEST(FormatTest, JoinArg) {
using fmt::join;
int v1[3] = { 1, 2, 3 };
Expand Down

0 comments on commit b1d10a2

Please sign in to comment.