Refactor state_generator.

The old implementation was scattered and ad hoc. This one is slightly
less so.

More importantly, refactoring to this design will make it easier to
add device traversal.
This commit is contained in:
Allison Vacanti
2021-02-11 21:24:58 -05:00
parent 4820c557a6
commit 9f9c6e5278
6 changed files with 279 additions and 193 deletions

View File

@@ -87,8 +87,47 @@ void test_basic()
ASSERT(!vals.has_value("String"));
}
void test_append()
{
nvbench::named_values vals1;
vals1.set_int64("Int1", 32);
vals1.set_float64("Float1", 34.5);
vals1.set_string("String1", "string1!");
vals1.set_value("IntVar1", {nvbench::int64_t{36}});
nvbench::named_values vals2;
vals2.set_int64("Int2", 42);
vals2.set_float64("Float2", 3.14);
vals2.set_string("String2", "string2!");
vals2.set_value("IntVar2", {nvbench::int64_t{55}});
vals1.append(vals2);
// Order should be preserved:
const auto &names = vals1.get_names();
ASSERT(names.size() == 8);
ASSERT(names[0] == "Int1");
ASSERT(names[1] == "Float1");
ASSERT(names[2] == "String1");
ASSERT(names[3] == "IntVar1");
ASSERT(names[4] == "Int2");
ASSERT(names[5] == "Float2");
ASSERT(names[6] == "String2");
ASSERT(names[7] == "IntVar2");
ASSERT(vals1.get_int64("Int1") == 32);
ASSERT(vals1.get_float64("Float1") == 34.5);
ASSERT(vals1.get_string("String1") == "string1!");
ASSERT(vals1.get_int64("IntVar1") == 36);
ASSERT(vals1.get_int64("Int2") == 42);
ASSERT(vals1.get_float64("Float2") == 3.14);
ASSERT(vals1.get_string("String2") == "string2!");
ASSERT(vals1.get_int64("IntVar2") == 55);
}
int main()
{
test_empty();
test_basic();
test_append();
}

View File

@@ -23,20 +23,10 @@ void template_generator(nvbench::state &, nvbench::type_list<F, I, M>){};
NVBENCH_DEFINE_CALLABLE_TEMPLATE(template_generator, template_callable);
using template_bench = nvbench::benchmark<template_callable, type_axes>;
struct state_generator_tester : nvbench::detail::state_generator
{
using nvbench::detail::state_generator::add_axis;
using nvbench::detail::state_generator::get_current_indices;
using nvbench::detail::state_generator::get_number_of_states;
using nvbench::detail::state_generator::init;
using nvbench::detail::state_generator::iter_valid;
using nvbench::detail::state_generator::next;
};
void test_empty()
{
// no axes = one state
state_generator_tester sg;
nvbench::detail::state_iterator sg;
ASSERT(sg.get_number_of_states() == 1);
sg.init();
ASSERT(sg.iter_valid());
@@ -47,7 +37,7 @@ void test_empty()
void test_single_state()
{
// one single-value axis = one state
state_generator_tester sg;
nvbench::detail::state_iterator sg;
sg.add_axis("OnlyAxis", nvbench::axis_type::string, 1);
ASSERT(sg.get_number_of_states() == 1);
sg.init();
@@ -64,7 +54,7 @@ void test_single_state()
void test_basic()
{
state_generator_tester sg;
nvbench::detail::state_iterator sg;
sg.add_axis("Axis1", nvbench::axis_type::string, 2);
sg.add_axis("Axis2", nvbench::axis_type::string, 3);
sg.add_axis("Axis3", nvbench::axis_type::string, 3);