Add nvbench::runner.

This commit is contained in:
Allison Vacanti
2020-12-31 21:27:51 -05:00
parent 29d7eafc33
commit 0776bdc4be
10 changed files with 822 additions and 162 deletions

View File

@@ -4,6 +4,7 @@
#include <nvbench/axes_metadata.cuh>
#include <nvbench/type_list.cuh>
#include <nvbench/runner.cuh>
#include <string>
#include <vector>
@@ -31,7 +32,7 @@ namespace nvbench
* @tparam TypeAxes A `nvbench::type_list` of `nvbench::type_list`s. See the
* [README](../README.md) for more details.
*/
template <typename KernelGenerator, typename TypeAxes>
template <typename KernelGenerator, typename TypeAxes = nvbench::type_list<>>
struct benchmark final : public benchmark_base
{
using kernel_generator = KernelGenerator;
@@ -53,6 +54,13 @@ private:
{
m_axes.template set_type_axes_names<type_axes>(std::move(names));
}
void do_run() override
{
nvbench::runner<benchmark> runner{*this};
runner.generate_states();
runner.run();
}
};
} // namespace nvbench

View File

@@ -1,10 +1,16 @@
#pragma once
#include <nvbench/axes_metadata.cuh>
#include <nvbench/state.cuh>
#include <vector>
namespace nvbench
{
template <typename BenchmarkType>
struct runner;
/**
* Hold runtime benchmark information and provides public customization API for
* the `NVBENCH_CREATE` macros.
@@ -24,12 +30,6 @@ struct benchmark_base
[[nodiscard]] const std::string &get_name() const { return m_name; }
// Convenience API for a single type_axis.
benchmark_base &set_type_axes_name(std::string name)
{
return this->set_type_axes_names({std::move(name)});
}
benchmark_base &set_type_axes_names(std::vector<std::string> names)
{
this->do_set_type_axes_names(std::move(names));
@@ -72,13 +72,30 @@ struct benchmark_base
return m_axes;
}
[[nodiscard]] const std::vector<std::vector<nvbench::state>> &
get_states() const
{
return m_states;
}
[[nodiscard]] std::vector<std::vector<nvbench::state>> &get_states()
{
return m_states;
}
void run() { this->do_run(); }
protected:
template <typename BenchmarkType>
friend struct runner;
std::string m_name;
nvbench::axes_metadata m_axes;
std::vector<std::vector<nvbench::state>> m_states;
private:
// route this through a virtual so the templated subclass can inject type info
// route these through virtuals so the templated subclass can inject type info
virtual void do_set_type_axes_names(std::vector<std::string> names) = 0;
virtual void do_run() = 0;
};
} // namespace nvbench

45
nvbench/callable.cuh Normal file
View File

@@ -0,0 +1,45 @@
#pragma once
#include <nvbench/type_list.cuh>
#include <type_traits>
namespace nvbench
{
struct state;
}
// Define a simple callable wrapper around a function. This allows the function
// to be used as a class template parameter. Intended for use with kernel
// generators and `NVBENCH_CREATE` macros.
#define NVBENCH_DEFINE_UNIQUE_CALLABLE(function) \
NVBENCH_DEFINE_CALLABLE(function, NVBENCH_UNIQUE_CALLABLE_NAME(function))
#define NVBENCH_DEFINE_CALLABLE(function, callable_name) \
struct callable_name \
{ \
void operator()(nvbench::state &state, nvbench::type_list<>) \
{ \
function(state); \
} \
}
#define NVBENCH_DEFINE_UNIQUE_CALLABLE_TEMPLATE(function) \
NVBENCH_DEFINE_CALLABLE_TEMPLATE(function, \
NVBENCH_UNIQUE_CALLABLE_NAME(function))
#define NVBENCH_DEFINE_CALLABLE_TEMPLATE(function, callable_name) \
struct callable_name \
{ \
template <typename... Ts> \
void operator()(nvbench::state &state, nvbench::type_list<Ts...>) \
{ \
function(state, nvbench::type_list<Ts...>{}); \
} \
}
#define NVBENCH_UNIQUE_CALLABLE_NAME(function) \
NVBENCH_UNIQUE_CALLABLE_NAME_IMPL(function, __LINE__)
#define NVBENCH_UNIQUE_CALLABLE_NAME_IMPL(function, unique_id) \
callable_name##_callable_##unique_id

View File

@@ -55,11 +55,13 @@ state_generator::create(const axes_metadata &axes)
}
});
// Sort type axes by index:
// Reverse sort type axes by index. This way the state_generator's cartesian
// product of the type axes values will be enumerated in the same order as
// nvbench::tl::cartesian_product<type_axes>.
std::sort(type_axes.begin(),
type_axes.end(),
[](const auto &axis_1, const auto &axis_2) {
return axis_1.get().get_axis_index() <
return axis_1.get().get_axis_index() >
axis_2.get().get_axis_index();
});
@@ -127,11 +129,11 @@ state_generator::create(const axes_metadata &axes)
axes.get_string_axis(axis_info.axis).get_value(axis_info.index));
break;
} // switch (type)
} // for (axis_info : current_indices)
} // for (axis_info : current_indices)
states.push_back(std::move(state));
} // for non_type_sg configs
} // for type_sg configs
} // scope break
} // for type_sg configs
} // scope break
// phew.
return result;

53
nvbench/runner.cuh Normal file
View File

@@ -0,0 +1,53 @@
#pragma once
#include <nvbench/detail/state_generator.cuh>
#include <stdexcept>
#include <vector>
namespace nvbench
{
template <typename BenchmarkType>
struct runner
{
using benchmark_type = BenchmarkType;
using kernel_generator = typename benchmark_type::kernel_generator;
using type_configs = typename benchmark_type::type_configs;
static constexpr std::size_t num_type_configs =
benchmark_type::num_type_configs;
explicit runner(benchmark_type &bench)
: m_benchmark{bench}
{}
void generate_states()
{
m_benchmark.m_states =
nvbench::detail::state_generator::create(m_benchmark.m_axes);
}
void run()
{
auto states_iter = m_benchmark.m_states.begin();
if (states_iter + num_type_configs != m_benchmark.m_states.end())
{
throw std::runtime_error("State vector doesn't match type_configs.");
}
nvbench::tl::foreach<type_configs>(
[&states_iter](auto type_config_wrapper) {
using type_config = typename decltype(type_config_wrapper)::type;
for (nvbench::state &cur_state : *states_iter)
{
kernel_generator{}(cur_state, type_config{});
}
states_iter++;
});
}
private:
benchmark_type &m_benchmark;
};
} // namespace nvbench

View File

@@ -29,6 +29,18 @@ struct state
[[nodiscard]] const std::string &
get_string(const std::string &axis_name) const;
void skip(std::string reason) { m_skip_reason = std::move(reason); }
[[nodiscard]] bool is_skipped() const { return !m_skip_reason.empty(); }
[[nodiscard]] const std::string &get_skip_reason() const
{
return m_skip_reason;
}
[[nodiscard]] const named_values &get_axis_values() const
{
return m_axis_values;
}
protected:
friend struct nvbench::detail::state_generator;
@@ -39,6 +51,7 @@ protected:
{}
nvbench::named_values m_axis_values;
std::string m_skip_reason;
};
} // namespace nvbench

View File

@@ -6,6 +6,7 @@ set(test_srcs
float64_axis.cu
int64_axis.cu
named_values.cu
runner.cu
state.cu
state_generator.cu
string_axis.cu

View File

@@ -1,5 +1,8 @@
#include <nvbench/benchmark.cuh>
#include <nvbench/callable.cuh>
#include <nvbench/named_values.cuh>
#include <nvbench/state.cuh>
#include <nvbench/type_list.cuh>
#include <nvbench/type_strings.cuh>
#include <nvbench/types.cuh>
@@ -8,7 +11,53 @@
#include <fmt/format.h>
struct dummy_kernel;
#include <algorithm>
#include <utility>
#include <variant>
#include <vector>
template <typename T>
std::vector<T> sort(std::vector<T> &&vec)
{
std::sort(vec.begin(), vec.end());
return std::move(vec);
}
void no_op_generator(nvbench::state &state)
{
fmt::memory_buffer params;
fmt::format_to(params, "Params:");
const auto &axis_values = state.get_axis_values();
for (const auto &name : sort(axis_values.get_names()))
{
std::visit(
[&params, &name](const auto &value) {
fmt::format_to(params, " {}: {}", name, value);
},
axis_values.get_value(name));
}
// Marking as skipped to signal that this state is run:
state.skip(fmt::to_string(std::move(params)));
}
NVBENCH_DEFINE_CALLABLE(no_op_generator, no_op_callable);
template <typename Integer, typename Float, typename Other>
void template_no_op_generator(nvbench::state &state,
nvbench::type_list<Integer, Float, Other>)
{
ASSERT(nvbench::type_strings<Integer>::input_string() ==
state.get_string("Integer"));
ASSERT(nvbench::type_strings<Float>::input_string() ==
state.get_string("Float"));
ASSERT(nvbench::type_strings<Other>::input_string() ==
state.get_string("Other"));
// Enum params using non-templated version:
no_op_generator(state);
}
NVBENCH_DEFINE_CALLABLE_TEMPLATE(template_no_op_generator,
template_no_op_callable);
using int_list = nvbench::type_list<nvbench::int8_t,
nvbench::int16_t,
@@ -20,12 +69,10 @@ using float_list = nvbench::type_list<nvbench::float32_t, nvbench::float64_t>;
using misc_list = nvbench::type_list<bool, void>;
using lots_of_types_bench =
nvbench::benchmark<dummy_kernel,
nvbench::benchmark<template_no_op_callable,
nvbench::type_list<int_list, float_list, misc_list>>;
using no_types = nvbench::type_list<>;
using no_types_bench = nvbench::benchmark<dummy_kernel, no_types>;
using no_types_bench = nvbench::benchmark<no_op_callable>;
void test_type_axes()
{
@@ -172,6 +219,15 @@ void test_string_axes()
ASSERT(axis.get_value(2) == "string c");
}
void test_run()
{
// More exhaustive testing is in runner.cu. This just tests that the
// runner is called.
no_types_bench bench;
ASSERT(bench.get_states().empty());
bench.run();
ASSERT(bench.get_states().size() == 1);
}
int main()
{
@@ -181,4 +237,5 @@ int main()
test_int64_axes();
test_int64_power_of_two_axes();
test_string_axes();
test_run();
}

464
testing/runner.cu Normal file
View File

@@ -0,0 +1,464 @@
#include <nvbench/runner.cuh>
#include <nvbench/benchmark.cuh>
#include <nvbench/callable.cuh>
#include <nvbench/state.cuh>
#include <nvbench/type_list.cuh>
#include <nvbench/type_strings.cuh>
#include <nvbench/types.cuh>
#include "test_asserts.cuh"
#include <fmt/format.h>
#include <algorithm>
#include <variant>
#include <vector>
template <typename T>
std::vector<T> sort(std::vector<T> &&vec)
{
std::sort(vec.begin(), vec.end());
return std::move(vec);
}
void no_op_generator(nvbench::state &state)
{
fmt::memory_buffer params;
fmt::format_to(params, "Params:");
const auto &axis_values = state.get_axis_values();
for (const auto &name : sort(axis_values.get_names()))
{
std::visit(
[&params, &name](const auto &value) {
fmt::format_to(params, " {}: {}", name, value);
},
axis_values.get_value(name));
}
// Marking as skipped to signal that this state is run:
state.skip(fmt::to_string(std::move(params)));
}
NVBENCH_DEFINE_CALLABLE(no_op_generator, no_op_callable);
using float_types = nvbench::type_list<nvbench::float32_t, nvbench::float64_t>;
using int_types = nvbench::type_list<nvbench::int32_t, nvbench::int64_t>;
using misc_types = nvbench::type_list<bool, void>;
using type_axes = nvbench::type_list<float_types, int_types, misc_types>;
template <typename FloatT, typename IntT, typename MiscT>
void template_no_op_generator(nvbench::state &state,
nvbench::type_list<FloatT, IntT, MiscT>)
{
ASSERT(nvbench::type_strings<FloatT>::input_string() ==
state.get_string("FloatT"));
ASSERT(nvbench::type_strings<IntT>::input_string() ==
state.get_string("IntT"));
ASSERT(nvbench::type_strings<IntT>::input_string() ==
state.get_string("IntT"));
// Enum params using non-templated version:
no_op_generator(state);
}
NVBENCH_DEFINE_CALLABLE_TEMPLATE(template_no_op_generator,
template_no_op_callable);
void test_empty()
{
using benchmark_type = nvbench::benchmark<no_op_callable>;
using runner_type = nvbench::runner<benchmark_type>;
benchmark_type bench;
runner_type runner{bench};
runner.generate_states();
ASSERT(bench.get_states().size() == 1);
ASSERT(bench.get_states().front().size() == 1);
ASSERT(bench.get_states().front().front().is_skipped() == false);
runner.run();
ASSERT(bench.get_states().size() == 1);
ASSERT(bench.get_states().front().size() == 1);
ASSERT(bench.get_states().front().front().is_skipped() == true);
}
void test_non_types()
{
using benchmark_type = nvbench::benchmark<no_op_callable>;
using runner_type = nvbench::runner<benchmark_type>;
benchmark_type bench;
bench.add_int64_axis("Int", {1, 2, 3});
bench.add_float64_axis("Float", {11.0, 12.0, 13.0});
bench.add_string_axis("String", {"One", "Two", "Three"});
runner_type runner{bench};
runner.generate_states();
ASSERT(bench.get_states().size() == 1);
ASSERT(bench.get_states().front().size() == 27);
for (const auto &state : bench.get_states().front())
{
ASSERT(state.is_skipped() == false);
}
fmt::memory_buffer buffer;
runner.run();
ASSERT(bench.get_states().size() == 1);
ASSERT(bench.get_states().front().size() == 27);
for (const auto &state : bench.get_states().front())
{
ASSERT(state.is_skipped() == true);
fmt::format_to(buffer, "{}\n", state.get_skip_reason());
}
const std::string ref = R"expected(Params: Float: 11 Int: 1 String: One
Params: Float: 11 Int: 2 String: One
Params: Float: 11 Int: 3 String: One
Params: Float: 12 Int: 1 String: One
Params: Float: 12 Int: 2 String: One
Params: Float: 12 Int: 3 String: One
Params: Float: 13 Int: 1 String: One
Params: Float: 13 Int: 2 String: One
Params: Float: 13 Int: 3 String: One
Params: Float: 11 Int: 1 String: Two
Params: Float: 11 Int: 2 String: Two
Params: Float: 11 Int: 3 String: Two
Params: Float: 12 Int: 1 String: Two
Params: Float: 12 Int: 2 String: Two
Params: Float: 12 Int: 3 String: Two
Params: Float: 13 Int: 1 String: Two
Params: Float: 13 Int: 2 String: Two
Params: Float: 13 Int: 3 String: Two
Params: Float: 11 Int: 1 String: Three
Params: Float: 11 Int: 2 String: Three
Params: Float: 11 Int: 3 String: Three
Params: Float: 12 Int: 1 String: Three
Params: Float: 12 Int: 2 String: Three
Params: Float: 12 Int: 3 String: Three
Params: Float: 13 Int: 1 String: Three
Params: Float: 13 Int: 2 String: Three
Params: Float: 13 Int: 3 String: Three
)expected";
const std::string test = fmt::to_string(buffer);
ASSERT_MSG(test == ref,
fmt::format("Expected:\n\"{}\"\n\nActual:\n\"{}\"", ref, test));
}
void test_types()
{
using benchmark_type = nvbench::benchmark<template_no_op_callable, type_axes>;
using runner_type = nvbench::runner<benchmark_type>;
benchmark_type bench;
bench.set_type_axes_names({"FloatT", "IntT", "MiscT"});
runner_type runner{bench};
runner.generate_states();
ASSERT(bench.get_states().size() == 8);
for (const auto &inner_states : bench.get_states())
{
ASSERT(inner_states.size() == 1);
for (const auto &state : inner_states)
{
ASSERT(state.is_skipped() == false);
}
}
fmt::memory_buffer buffer;
runner.run();
ASSERT(bench.get_states().size() == 8);
for (const auto &inner_states : bench.get_states())
{
ASSERT(inner_states.size() == 1);
for (const auto &state : inner_states)
{
ASSERT(state.is_skipped() == true);
fmt::format_to(buffer, "{}\n", state.get_skip_reason());
}
}
const std::string ref = R"expected(Params: FloatT: F32 IntT: I32 MiscT: bool
Params: FloatT: F32 IntT: I32 MiscT: void
Params: FloatT: F32 IntT: I64 MiscT: bool
Params: FloatT: F32 IntT: I64 MiscT: void
Params: FloatT: F64 IntT: I32 MiscT: bool
Params: FloatT: F64 IntT: I32 MiscT: void
Params: FloatT: F64 IntT: I64 MiscT: bool
Params: FloatT: F64 IntT: I64 MiscT: void
)expected";
const std::string test = fmt::to_string(buffer);
ASSERT_MSG(test == ref,
fmt::format("Expected:\n\"{}\"\n\nActual:\n\"{}\"", ref, test));
}
void test_both()
{
using benchmark_type = nvbench::benchmark<template_no_op_callable, type_axes>;
using runner_type = nvbench::runner<benchmark_type>;
benchmark_type bench;
bench.set_type_axes_names({"FloatT", "IntT", "MiscT"});
bench.add_int64_axis("Int", {1, 2, 3});
bench.add_float64_axis("Float", {11.0, 12.0, 13.0});
bench.add_string_axis("String", {"One", "Two", "Three"});
runner_type runner{bench};
runner.generate_states();
ASSERT(bench.get_states().size() == 8);
for (const auto &inner_states : bench.get_states())
{
ASSERT(inner_states.size() == 27);
for (const auto &state : inner_states)
{
ASSERT(state.is_skipped() == false);
}
}
fmt::memory_buffer buffer;
runner.run();
ASSERT(bench.get_states().size() == 8);
for (const auto &inner_states : bench.get_states())
{
ASSERT(inner_states.size() == 27);
for (const auto &state : inner_states)
{
ASSERT(state.is_skipped() == true);
fmt::format_to(buffer, "{}\n", state.get_skip_reason());
}
}
const std::string ref =
R"expected(Params: Float: 11 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: One
Params: Float: 11 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: One
Params: Float: 11 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: One
Params: Float: 12 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: One
Params: Float: 12 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: One
Params: Float: 12 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: One
Params: Float: 13 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: One
Params: Float: 13 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: One
Params: Float: 13 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: One
Params: Float: 11 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: Two
Params: Float: 11 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: Two
Params: Float: 11 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: Two
Params: Float: 12 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: Two
Params: Float: 12 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: Two
Params: Float: 12 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: Two
Params: Float: 13 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: Two
Params: Float: 13 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: Two
Params: Float: 13 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: Two
Params: Float: 11 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: Three
Params: Float: 11 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: Three
Params: Float: 11 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: Three
Params: Float: 12 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: Three
Params: Float: 12 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: Three
Params: Float: 12 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: Three
Params: Float: 13 FloatT: F32 Int: 1 IntT: I32 MiscT: bool String: Three
Params: Float: 13 FloatT: F32 Int: 2 IntT: I32 MiscT: bool String: Three
Params: Float: 13 FloatT: F32 Int: 3 IntT: I32 MiscT: bool String: Three
Params: Float: 11 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: One
Params: Float: 11 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: One
Params: Float: 11 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: One
Params: Float: 12 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: One
Params: Float: 12 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: One
Params: Float: 12 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: One
Params: Float: 13 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: One
Params: Float: 13 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: One
Params: Float: 13 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: One
Params: Float: 11 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: Two
Params: Float: 11 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: Two
Params: Float: 11 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: Two
Params: Float: 12 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: Two
Params: Float: 12 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: Two
Params: Float: 12 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: Two
Params: Float: 13 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: Two
Params: Float: 13 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: Two
Params: Float: 13 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: Two
Params: Float: 11 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: Three
Params: Float: 11 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: Three
Params: Float: 11 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: Three
Params: Float: 12 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: Three
Params: Float: 12 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: Three
Params: Float: 12 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: Three
Params: Float: 13 FloatT: F32 Int: 1 IntT: I32 MiscT: void String: Three
Params: Float: 13 FloatT: F32 Int: 2 IntT: I32 MiscT: void String: Three
Params: Float: 13 FloatT: F32 Int: 3 IntT: I32 MiscT: void String: Three
Params: Float: 11 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: One
Params: Float: 11 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: One
Params: Float: 11 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: One
Params: Float: 12 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: One
Params: Float: 12 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: One
Params: Float: 12 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: One
Params: Float: 13 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: One
Params: Float: 13 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: One
Params: Float: 13 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: One
Params: Float: 11 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: Two
Params: Float: 11 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: Two
Params: Float: 11 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: Two
Params: Float: 12 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: Two
Params: Float: 12 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: Two
Params: Float: 12 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: Two
Params: Float: 13 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: Two
Params: Float: 13 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: Two
Params: Float: 13 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: Two
Params: Float: 11 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: Three
Params: Float: 11 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: Three
Params: Float: 11 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: Three
Params: Float: 12 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: Three
Params: Float: 12 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: Three
Params: Float: 12 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: Three
Params: Float: 13 FloatT: F32 Int: 1 IntT: I64 MiscT: bool String: Three
Params: Float: 13 FloatT: F32 Int: 2 IntT: I64 MiscT: bool String: Three
Params: Float: 13 FloatT: F32 Int: 3 IntT: I64 MiscT: bool String: Three
Params: Float: 11 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: One
Params: Float: 11 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: One
Params: Float: 11 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: One
Params: Float: 12 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: One
Params: Float: 12 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: One
Params: Float: 12 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: One
Params: Float: 13 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: One
Params: Float: 13 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: One
Params: Float: 13 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: One
Params: Float: 11 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: Two
Params: Float: 11 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: Two
Params: Float: 11 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: Two
Params: Float: 12 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: Two
Params: Float: 12 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: Two
Params: Float: 12 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: Two
Params: Float: 13 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: Two
Params: Float: 13 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: Two
Params: Float: 13 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: Two
Params: Float: 11 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: Three
Params: Float: 11 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: Three
Params: Float: 11 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: Three
Params: Float: 12 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: Three
Params: Float: 12 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: Three
Params: Float: 12 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: Three
Params: Float: 13 FloatT: F32 Int: 1 IntT: I64 MiscT: void String: Three
Params: Float: 13 FloatT: F32 Int: 2 IntT: I64 MiscT: void String: Three
Params: Float: 13 FloatT: F32 Int: 3 IntT: I64 MiscT: void String: Three
Params: Float: 11 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: One
Params: Float: 11 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: One
Params: Float: 11 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: One
Params: Float: 12 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: One
Params: Float: 12 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: One
Params: Float: 12 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: One
Params: Float: 13 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: One
Params: Float: 13 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: One
Params: Float: 13 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: One
Params: Float: 11 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: Two
Params: Float: 11 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: Two
Params: Float: 11 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: Two
Params: Float: 12 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: Two
Params: Float: 12 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: Two
Params: Float: 12 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: Two
Params: Float: 13 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: Two
Params: Float: 13 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: Two
Params: Float: 13 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: Two
Params: Float: 11 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: Three
Params: Float: 11 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: Three
Params: Float: 11 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: Three
Params: Float: 12 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: Three
Params: Float: 12 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: Three
Params: Float: 12 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: Three
Params: Float: 13 FloatT: F64 Int: 1 IntT: I32 MiscT: bool String: Three
Params: Float: 13 FloatT: F64 Int: 2 IntT: I32 MiscT: bool String: Three
Params: Float: 13 FloatT: F64 Int: 3 IntT: I32 MiscT: bool String: Three
Params: Float: 11 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: One
Params: Float: 11 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: One
Params: Float: 11 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: One
Params: Float: 12 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: One
Params: Float: 12 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: One
Params: Float: 12 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: One
Params: Float: 13 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: One
Params: Float: 13 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: One
Params: Float: 13 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: One
Params: Float: 11 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: Two
Params: Float: 11 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: Two
Params: Float: 11 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: Two
Params: Float: 12 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: Two
Params: Float: 12 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: Two
Params: Float: 12 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: Two
Params: Float: 13 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: Two
Params: Float: 13 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: Two
Params: Float: 13 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: Two
Params: Float: 11 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: Three
Params: Float: 11 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: Three
Params: Float: 11 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: Three
Params: Float: 12 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: Three
Params: Float: 12 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: Three
Params: Float: 12 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: Three
Params: Float: 13 FloatT: F64 Int: 1 IntT: I32 MiscT: void String: Three
Params: Float: 13 FloatT: F64 Int: 2 IntT: I32 MiscT: void String: Three
Params: Float: 13 FloatT: F64 Int: 3 IntT: I32 MiscT: void String: Three
Params: Float: 11 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: One
Params: Float: 11 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: One
Params: Float: 11 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: One
Params: Float: 12 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: One
Params: Float: 12 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: One
Params: Float: 12 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: One
Params: Float: 13 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: One
Params: Float: 13 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: One
Params: Float: 13 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: One
Params: Float: 11 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: Two
Params: Float: 11 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: Two
Params: Float: 11 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: Two
Params: Float: 12 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: Two
Params: Float: 12 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: Two
Params: Float: 12 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: Two
Params: Float: 13 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: Two
Params: Float: 13 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: Two
Params: Float: 13 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: Two
Params: Float: 11 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: Three
Params: Float: 11 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: Three
Params: Float: 11 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: Three
Params: Float: 12 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: Three
Params: Float: 12 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: Three
Params: Float: 12 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: Three
Params: Float: 13 FloatT: F64 Int: 1 IntT: I64 MiscT: bool String: Three
Params: Float: 13 FloatT: F64 Int: 2 IntT: I64 MiscT: bool String: Three
Params: Float: 13 FloatT: F64 Int: 3 IntT: I64 MiscT: bool String: Three
Params: Float: 11 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: One
Params: Float: 11 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: One
Params: Float: 11 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: One
Params: Float: 12 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: One
Params: Float: 12 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: One
Params: Float: 12 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: One
Params: Float: 13 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: One
Params: Float: 13 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: One
Params: Float: 13 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: One
Params: Float: 11 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: Two
Params: Float: 11 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: Two
Params: Float: 11 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: Two
Params: Float: 12 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: Two
Params: Float: 12 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: Two
Params: Float: 12 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: Two
Params: Float: 13 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: Two
Params: Float: 13 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: Two
Params: Float: 13 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: Two
Params: Float: 11 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: Three
Params: Float: 11 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: Three
Params: Float: 11 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: Three
Params: Float: 12 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: Three
Params: Float: 12 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: Three
Params: Float: 12 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: Three
Params: Float: 13 FloatT: F64 Int: 1 IntT: I64 MiscT: void String: Three
Params: Float: 13 FloatT: F64 Int: 2 IntT: I64 MiscT: void String: Three
Params: Float: 13 FloatT: F64 Int: 3 IntT: I64 MiscT: void String: Three
)expected";
const std::string test = fmt::to_string(buffer);
ASSERT_MSG(test == ref,
fmt::format("Expected:\n\"{}\"\n\nActual:\n\"{}\"", ref, test));
}
int main()
{
test_empty();
test_non_types();
test_types();
test_both();
}

View File

@@ -333,42 +333,42 @@ void test_create_with_types()
| 33 | 0 | F32 | I32 | void | 6.28 | 3 | 1048576 | Iterative |
| 34 | 0 | F32 | I32 | void | 3.14 | 4 | 1048576 | Iterative |
| 35 | 0 | F32 | I32 | void | 6.28 | 4 | 1048576 | Iterative |
| 36 | 1 | F64 | I32 | void | 3.14 | 2 | 1024 | Recursive |
| 37 | 1 | F64 | I32 | void | 6.28 | 2 | 1024 | Recursive |
| 38 | 1 | F64 | I32 | void | 3.14 | 3 | 1024 | Recursive |
| 39 | 1 | F64 | I32 | void | 6.28 | 3 | 1024 | Recursive |
| 40 | 1 | F64 | I32 | void | 3.14 | 4 | 1024 | Recursive |
| 41 | 1 | F64 | I32 | void | 6.28 | 4 | 1024 | Recursive |
| 42 | 1 | F64 | I32 | void | 3.14 | 2 | 32768 | Recursive |
| 43 | 1 | F64 | I32 | void | 6.28 | 2 | 32768 | Recursive |
| 44 | 1 | F64 | I32 | void | 3.14 | 3 | 32768 | Recursive |
| 45 | 1 | F64 | I32 | void | 6.28 | 3 | 32768 | Recursive |
| 46 | 1 | F64 | I32 | void | 3.14 | 4 | 32768 | Recursive |
| 47 | 1 | F64 | I32 | void | 6.28 | 4 | 32768 | Recursive |
| 48 | 1 | F64 | I32 | void | 3.14 | 2 | 1048576 | Recursive |
| 49 | 1 | F64 | I32 | void | 6.28 | 2 | 1048576 | Recursive |
| 50 | 1 | F64 | I32 | void | 3.14 | 3 | 1048576 | Recursive |
| 51 | 1 | F64 | I32 | void | 6.28 | 3 | 1048576 | Recursive |
| 52 | 1 | F64 | I32 | void | 3.14 | 4 | 1048576 | Recursive |
| 53 | 1 | F64 | I32 | void | 6.28 | 4 | 1048576 | Recursive |
| 54 | 1 | F64 | I32 | void | 3.14 | 2 | 1024 | Iterative |
| 55 | 1 | F64 | I32 | void | 6.28 | 2 | 1024 | Iterative |
| 56 | 1 | F64 | I32 | void | 3.14 | 3 | 1024 | Iterative |
| 57 | 1 | F64 | I32 | void | 6.28 | 3 | 1024 | Iterative |
| 58 | 1 | F64 | I32 | void | 3.14 | 4 | 1024 | Iterative |
| 59 | 1 | F64 | I32 | void | 6.28 | 4 | 1024 | Iterative |
| 60 | 1 | F64 | I32 | void | 3.14 | 2 | 32768 | Iterative |
| 61 | 1 | F64 | I32 | void | 6.28 | 2 | 32768 | Iterative |
| 62 | 1 | F64 | I32 | void | 3.14 | 3 | 32768 | Iterative |
| 63 | 1 | F64 | I32 | void | 6.28 | 3 | 32768 | Iterative |
| 64 | 1 | F64 | I32 | void | 3.14 | 4 | 32768 | Iterative |
| 65 | 1 | F64 | I32 | void | 6.28 | 4 | 32768 | Iterative |
| 66 | 1 | F64 | I32 | void | 3.14 | 2 | 1048576 | Iterative |
| 67 | 1 | F64 | I32 | void | 6.28 | 2 | 1048576 | Iterative |
| 68 | 1 | F64 | I32 | void | 3.14 | 3 | 1048576 | Iterative |
| 69 | 1 | F64 | I32 | void | 6.28 | 3 | 1048576 | Iterative |
| 70 | 1 | F64 | I32 | void | 3.14 | 4 | 1048576 | Iterative |
| 71 | 1 | F64 | I32 | void | 6.28 | 4 | 1048576 | Iterative |
| 36 | 1 | F32 | I32 | bool | 3.14 | 2 | 1024 | Recursive |
| 37 | 1 | F32 | I32 | bool | 6.28 | 2 | 1024 | Recursive |
| 38 | 1 | F32 | I32 | bool | 3.14 | 3 | 1024 | Recursive |
| 39 | 1 | F32 | I32 | bool | 6.28 | 3 | 1024 | Recursive |
| 40 | 1 | F32 | I32 | bool | 3.14 | 4 | 1024 | Recursive |
| 41 | 1 | F32 | I32 | bool | 6.28 | 4 | 1024 | Recursive |
| 42 | 1 | F32 | I32 | bool | 3.14 | 2 | 32768 | Recursive |
| 43 | 1 | F32 | I32 | bool | 6.28 | 2 | 32768 | Recursive |
| 44 | 1 | F32 | I32 | bool | 3.14 | 3 | 32768 | Recursive |
| 45 | 1 | F32 | I32 | bool | 6.28 | 3 | 32768 | Recursive |
| 46 | 1 | F32 | I32 | bool | 3.14 | 4 | 32768 | Recursive |
| 47 | 1 | F32 | I32 | bool | 6.28 | 4 | 32768 | Recursive |
| 48 | 1 | F32 | I32 | bool | 3.14 | 2 | 1048576 | Recursive |
| 49 | 1 | F32 | I32 | bool | 6.28 | 2 | 1048576 | Recursive |
| 50 | 1 | F32 | I32 | bool | 3.14 | 3 | 1048576 | Recursive |
| 51 | 1 | F32 | I32 | bool | 6.28 | 3 | 1048576 | Recursive |
| 52 | 1 | F32 | I32 | bool | 3.14 | 4 | 1048576 | Recursive |
| 53 | 1 | F32 | I32 | bool | 6.28 | 4 | 1048576 | Recursive |
| 54 | 1 | F32 | I32 | bool | 3.14 | 2 | 1024 | Iterative |
| 55 | 1 | F32 | I32 | bool | 6.28 | 2 | 1024 | Iterative |
| 56 | 1 | F32 | I32 | bool | 3.14 | 3 | 1024 | Iterative |
| 57 | 1 | F32 | I32 | bool | 6.28 | 3 | 1024 | Iterative |
| 58 | 1 | F32 | I32 | bool | 3.14 | 4 | 1024 | Iterative |
| 59 | 1 | F32 | I32 | bool | 6.28 | 4 | 1024 | Iterative |
| 60 | 1 | F32 | I32 | bool | 3.14 | 2 | 32768 | Iterative |
| 61 | 1 | F32 | I32 | bool | 6.28 | 2 | 32768 | Iterative |
| 62 | 1 | F32 | I32 | bool | 3.14 | 3 | 32768 | Iterative |
| 63 | 1 | F32 | I32 | bool | 6.28 | 3 | 32768 | Iterative |
| 64 | 1 | F32 | I32 | bool | 3.14 | 4 | 32768 | Iterative |
| 65 | 1 | F32 | I32 | bool | 6.28 | 4 | 32768 | Iterative |
| 66 | 1 | F32 | I32 | bool | 3.14 | 2 | 1048576 | Iterative |
| 67 | 1 | F32 | I32 | bool | 6.28 | 2 | 1048576 | Iterative |
| 68 | 1 | F32 | I32 | bool | 3.14 | 3 | 1048576 | Iterative |
| 69 | 1 | F32 | I32 | bool | 6.28 | 3 | 1048576 | Iterative |
| 70 | 1 | F32 | I32 | bool | 3.14 | 4 | 1048576 | Iterative |
| 71 | 1 | F32 | I32 | bool | 6.28 | 4 | 1048576 | Iterative |
| 72 | 2 | F32 | I64 | void | 3.14 | 2 | 1024 | Recursive |
| 73 | 2 | F32 | I64 | void | 6.28 | 2 | 1024 | Recursive |
| 74 | 2 | F32 | I64 | void | 3.14 | 3 | 1024 | Recursive |
@@ -405,78 +405,78 @@ void test_create_with_types()
| 105 | 2 | F32 | I64 | void | 6.28 | 3 | 1048576 | Iterative |
| 106 | 2 | F32 | I64 | void | 3.14 | 4 | 1048576 | Iterative |
| 107 | 2 | F32 | I64 | void | 6.28 | 4 | 1048576 | Iterative |
| 108 | 3 | F64 | I64 | void | 3.14 | 2 | 1024 | Recursive |
| 109 | 3 | F64 | I64 | void | 6.28 | 2 | 1024 | Recursive |
| 110 | 3 | F64 | I64 | void | 3.14 | 3 | 1024 | Recursive |
| 111 | 3 | F64 | I64 | void | 6.28 | 3 | 1024 | Recursive |
| 112 | 3 | F64 | I64 | void | 3.14 | 4 | 1024 | Recursive |
| 113 | 3 | F64 | I64 | void | 6.28 | 4 | 1024 | Recursive |
| 114 | 3 | F64 | I64 | void | 3.14 | 2 | 32768 | Recursive |
| 115 | 3 | F64 | I64 | void | 6.28 | 2 | 32768 | Recursive |
| 116 | 3 | F64 | I64 | void | 3.14 | 3 | 32768 | Recursive |
| 117 | 3 | F64 | I64 | void | 6.28 | 3 | 32768 | Recursive |
| 118 | 3 | F64 | I64 | void | 3.14 | 4 | 32768 | Recursive |
| 119 | 3 | F64 | I64 | void | 6.28 | 4 | 32768 | Recursive |
| 120 | 3 | F64 | I64 | void | 3.14 | 2 | 1048576 | Recursive |
| 121 | 3 | F64 | I64 | void | 6.28 | 2 | 1048576 | Recursive |
| 122 | 3 | F64 | I64 | void | 3.14 | 3 | 1048576 | Recursive |
| 123 | 3 | F64 | I64 | void | 6.28 | 3 | 1048576 | Recursive |
| 124 | 3 | F64 | I64 | void | 3.14 | 4 | 1048576 | Recursive |
| 125 | 3 | F64 | I64 | void | 6.28 | 4 | 1048576 | Recursive |
| 126 | 3 | F64 | I64 | void | 3.14 | 2 | 1024 | Iterative |
| 127 | 3 | F64 | I64 | void | 6.28 | 2 | 1024 | Iterative |
| 128 | 3 | F64 | I64 | void | 3.14 | 3 | 1024 | Iterative |
| 129 | 3 | F64 | I64 | void | 6.28 | 3 | 1024 | Iterative |
| 130 | 3 | F64 | I64 | void | 3.14 | 4 | 1024 | Iterative |
| 131 | 3 | F64 | I64 | void | 6.28 | 4 | 1024 | Iterative |
| 132 | 3 | F64 | I64 | void | 3.14 | 2 | 32768 | Iterative |
| 133 | 3 | F64 | I64 | void | 6.28 | 2 | 32768 | Iterative |
| 134 | 3 | F64 | I64 | void | 3.14 | 3 | 32768 | Iterative |
| 135 | 3 | F64 | I64 | void | 6.28 | 3 | 32768 | Iterative |
| 136 | 3 | F64 | I64 | void | 3.14 | 4 | 32768 | Iterative |
| 137 | 3 | F64 | I64 | void | 6.28 | 4 | 32768 | Iterative |
| 138 | 3 | F64 | I64 | void | 3.14 | 2 | 1048576 | Iterative |
| 139 | 3 | F64 | I64 | void | 6.28 | 2 | 1048576 | Iterative |
| 140 | 3 | F64 | I64 | void | 3.14 | 3 | 1048576 | Iterative |
| 141 | 3 | F64 | I64 | void | 6.28 | 3 | 1048576 | Iterative |
| 142 | 3 | F64 | I64 | void | 3.14 | 4 | 1048576 | Iterative |
| 143 | 3 | F64 | I64 | void | 6.28 | 4 | 1048576 | Iterative |
| 144 | 4 | F32 | I32 | bool | 3.14 | 2 | 1024 | Recursive |
| 145 | 4 | F32 | I32 | bool | 6.28 | 2 | 1024 | Recursive |
| 146 | 4 | F32 | I32 | bool | 3.14 | 3 | 1024 | Recursive |
| 147 | 4 | F32 | I32 | bool | 6.28 | 3 | 1024 | Recursive |
| 148 | 4 | F32 | I32 | bool | 3.14 | 4 | 1024 | Recursive |
| 149 | 4 | F32 | I32 | bool | 6.28 | 4 | 1024 | Recursive |
| 150 | 4 | F32 | I32 | bool | 3.14 | 2 | 32768 | Recursive |
| 151 | 4 | F32 | I32 | bool | 6.28 | 2 | 32768 | Recursive |
| 152 | 4 | F32 | I32 | bool | 3.14 | 3 | 32768 | Recursive |
| 153 | 4 | F32 | I32 | bool | 6.28 | 3 | 32768 | Recursive |
| 154 | 4 | F32 | I32 | bool | 3.14 | 4 | 32768 | Recursive |
| 155 | 4 | F32 | I32 | bool | 6.28 | 4 | 32768 | Recursive |
| 156 | 4 | F32 | I32 | bool | 3.14 | 2 | 1048576 | Recursive |
| 157 | 4 | F32 | I32 | bool | 6.28 | 2 | 1048576 | Recursive |
| 158 | 4 | F32 | I32 | bool | 3.14 | 3 | 1048576 | Recursive |
| 159 | 4 | F32 | I32 | bool | 6.28 | 3 | 1048576 | Recursive |
| 160 | 4 | F32 | I32 | bool | 3.14 | 4 | 1048576 | Recursive |
| 161 | 4 | F32 | I32 | bool | 6.28 | 4 | 1048576 | Recursive |
| 162 | 4 | F32 | I32 | bool | 3.14 | 2 | 1024 | Iterative |
| 163 | 4 | F32 | I32 | bool | 6.28 | 2 | 1024 | Iterative |
| 164 | 4 | F32 | I32 | bool | 3.14 | 3 | 1024 | Iterative |
| 165 | 4 | F32 | I32 | bool | 6.28 | 3 | 1024 | Iterative |
| 166 | 4 | F32 | I32 | bool | 3.14 | 4 | 1024 | Iterative |
| 167 | 4 | F32 | I32 | bool | 6.28 | 4 | 1024 | Iterative |
| 168 | 4 | F32 | I32 | bool | 3.14 | 2 | 32768 | Iterative |
| 169 | 4 | F32 | I32 | bool | 6.28 | 2 | 32768 | Iterative |
| 170 | 4 | F32 | I32 | bool | 3.14 | 3 | 32768 | Iterative |
| 171 | 4 | F32 | I32 | bool | 6.28 | 3 | 32768 | Iterative |
| 172 | 4 | F32 | I32 | bool | 3.14 | 4 | 32768 | Iterative |
| 173 | 4 | F32 | I32 | bool | 6.28 | 4 | 32768 | Iterative |
| 174 | 4 | F32 | I32 | bool | 3.14 | 2 | 1048576 | Iterative |
| 175 | 4 | F32 | I32 | bool | 6.28 | 2 | 1048576 | Iterative |
| 176 | 4 | F32 | I32 | bool | 3.14 | 3 | 1048576 | Iterative |
| 177 | 4 | F32 | I32 | bool | 6.28 | 3 | 1048576 | Iterative |
| 178 | 4 | F32 | I32 | bool | 3.14 | 4 | 1048576 | Iterative |
| 179 | 4 | F32 | I32 | bool | 6.28 | 4 | 1048576 | Iterative |
| 108 | 3 | F32 | I64 | bool | 3.14 | 2 | 1024 | Recursive |
| 109 | 3 | F32 | I64 | bool | 6.28 | 2 | 1024 | Recursive |
| 110 | 3 | F32 | I64 | bool | 3.14 | 3 | 1024 | Recursive |
| 111 | 3 | F32 | I64 | bool | 6.28 | 3 | 1024 | Recursive |
| 112 | 3 | F32 | I64 | bool | 3.14 | 4 | 1024 | Recursive |
| 113 | 3 | F32 | I64 | bool | 6.28 | 4 | 1024 | Recursive |
| 114 | 3 | F32 | I64 | bool | 3.14 | 2 | 32768 | Recursive |
| 115 | 3 | F32 | I64 | bool | 6.28 | 2 | 32768 | Recursive |
| 116 | 3 | F32 | I64 | bool | 3.14 | 3 | 32768 | Recursive |
| 117 | 3 | F32 | I64 | bool | 6.28 | 3 | 32768 | Recursive |
| 118 | 3 | F32 | I64 | bool | 3.14 | 4 | 32768 | Recursive |
| 119 | 3 | F32 | I64 | bool | 6.28 | 4 | 32768 | Recursive |
| 120 | 3 | F32 | I64 | bool | 3.14 | 2 | 1048576 | Recursive |
| 121 | 3 | F32 | I64 | bool | 6.28 | 2 | 1048576 | Recursive |
| 122 | 3 | F32 | I64 | bool | 3.14 | 3 | 1048576 | Recursive |
| 123 | 3 | F32 | I64 | bool | 6.28 | 3 | 1048576 | Recursive |
| 124 | 3 | F32 | I64 | bool | 3.14 | 4 | 1048576 | Recursive |
| 125 | 3 | F32 | I64 | bool | 6.28 | 4 | 1048576 | Recursive |
| 126 | 3 | F32 | I64 | bool | 3.14 | 2 | 1024 | Iterative |
| 127 | 3 | F32 | I64 | bool | 6.28 | 2 | 1024 | Iterative |
| 128 | 3 | F32 | I64 | bool | 3.14 | 3 | 1024 | Iterative |
| 129 | 3 | F32 | I64 | bool | 6.28 | 3 | 1024 | Iterative |
| 130 | 3 | F32 | I64 | bool | 3.14 | 4 | 1024 | Iterative |
| 131 | 3 | F32 | I64 | bool | 6.28 | 4 | 1024 | Iterative |
| 132 | 3 | F32 | I64 | bool | 3.14 | 2 | 32768 | Iterative |
| 133 | 3 | F32 | I64 | bool | 6.28 | 2 | 32768 | Iterative |
| 134 | 3 | F32 | I64 | bool | 3.14 | 3 | 32768 | Iterative |
| 135 | 3 | F32 | I64 | bool | 6.28 | 3 | 32768 | Iterative |
| 136 | 3 | F32 | I64 | bool | 3.14 | 4 | 32768 | Iterative |
| 137 | 3 | F32 | I64 | bool | 6.28 | 4 | 32768 | Iterative |
| 138 | 3 | F32 | I64 | bool | 3.14 | 2 | 1048576 | Iterative |
| 139 | 3 | F32 | I64 | bool | 6.28 | 2 | 1048576 | Iterative |
| 140 | 3 | F32 | I64 | bool | 3.14 | 3 | 1048576 | Iterative |
| 141 | 3 | F32 | I64 | bool | 6.28 | 3 | 1048576 | Iterative |
| 142 | 3 | F32 | I64 | bool | 3.14 | 4 | 1048576 | Iterative |
| 143 | 3 | F32 | I64 | bool | 6.28 | 4 | 1048576 | Iterative |
| 144 | 4 | F64 | I32 | void | 3.14 | 2 | 1024 | Recursive |
| 145 | 4 | F64 | I32 | void | 6.28 | 2 | 1024 | Recursive |
| 146 | 4 | F64 | I32 | void | 3.14 | 3 | 1024 | Recursive |
| 147 | 4 | F64 | I32 | void | 6.28 | 3 | 1024 | Recursive |
| 148 | 4 | F64 | I32 | void | 3.14 | 4 | 1024 | Recursive |
| 149 | 4 | F64 | I32 | void | 6.28 | 4 | 1024 | Recursive |
| 150 | 4 | F64 | I32 | void | 3.14 | 2 | 32768 | Recursive |
| 151 | 4 | F64 | I32 | void | 6.28 | 2 | 32768 | Recursive |
| 152 | 4 | F64 | I32 | void | 3.14 | 3 | 32768 | Recursive |
| 153 | 4 | F64 | I32 | void | 6.28 | 3 | 32768 | Recursive |
| 154 | 4 | F64 | I32 | void | 3.14 | 4 | 32768 | Recursive |
| 155 | 4 | F64 | I32 | void | 6.28 | 4 | 32768 | Recursive |
| 156 | 4 | F64 | I32 | void | 3.14 | 2 | 1048576 | Recursive |
| 157 | 4 | F64 | I32 | void | 6.28 | 2 | 1048576 | Recursive |
| 158 | 4 | F64 | I32 | void | 3.14 | 3 | 1048576 | Recursive |
| 159 | 4 | F64 | I32 | void | 6.28 | 3 | 1048576 | Recursive |
| 160 | 4 | F64 | I32 | void | 3.14 | 4 | 1048576 | Recursive |
| 161 | 4 | F64 | I32 | void | 6.28 | 4 | 1048576 | Recursive |
| 162 | 4 | F64 | I32 | void | 3.14 | 2 | 1024 | Iterative |
| 163 | 4 | F64 | I32 | void | 6.28 | 2 | 1024 | Iterative |
| 164 | 4 | F64 | I32 | void | 3.14 | 3 | 1024 | Iterative |
| 165 | 4 | F64 | I32 | void | 6.28 | 3 | 1024 | Iterative |
| 166 | 4 | F64 | I32 | void | 3.14 | 4 | 1024 | Iterative |
| 167 | 4 | F64 | I32 | void | 6.28 | 4 | 1024 | Iterative |
| 168 | 4 | F64 | I32 | void | 3.14 | 2 | 32768 | Iterative |
| 169 | 4 | F64 | I32 | void | 6.28 | 2 | 32768 | Iterative |
| 170 | 4 | F64 | I32 | void | 3.14 | 3 | 32768 | Iterative |
| 171 | 4 | F64 | I32 | void | 6.28 | 3 | 32768 | Iterative |
| 172 | 4 | F64 | I32 | void | 3.14 | 4 | 32768 | Iterative |
| 173 | 4 | F64 | I32 | void | 6.28 | 4 | 32768 | Iterative |
| 174 | 4 | F64 | I32 | void | 3.14 | 2 | 1048576 | Iterative |
| 175 | 4 | F64 | I32 | void | 6.28 | 2 | 1048576 | Iterative |
| 176 | 4 | F64 | I32 | void | 3.14 | 3 | 1048576 | Iterative |
| 177 | 4 | F64 | I32 | void | 6.28 | 3 | 1048576 | Iterative |
| 178 | 4 | F64 | I32 | void | 3.14 | 4 | 1048576 | Iterative |
| 179 | 4 | F64 | I32 | void | 6.28 | 4 | 1048576 | Iterative |
| 180 | 5 | F64 | I32 | bool | 3.14 | 2 | 1024 | Recursive |
| 181 | 5 | F64 | I32 | bool | 6.28 | 2 | 1024 | Recursive |
| 182 | 5 | F64 | I32 | bool | 3.14 | 3 | 1024 | Recursive |
@@ -513,42 +513,42 @@ void test_create_with_types()
| 213 | 5 | F64 | I32 | bool | 6.28 | 3 | 1048576 | Iterative |
| 214 | 5 | F64 | I32 | bool | 3.14 | 4 | 1048576 | Iterative |
| 215 | 5 | F64 | I32 | bool | 6.28 | 4 | 1048576 | Iterative |
| 216 | 6 | F32 | I64 | bool | 3.14 | 2 | 1024 | Recursive |
| 217 | 6 | F32 | I64 | bool | 6.28 | 2 | 1024 | Recursive |
| 218 | 6 | F32 | I64 | bool | 3.14 | 3 | 1024 | Recursive |
| 219 | 6 | F32 | I64 | bool | 6.28 | 3 | 1024 | Recursive |
| 220 | 6 | F32 | I64 | bool | 3.14 | 4 | 1024 | Recursive |
| 221 | 6 | F32 | I64 | bool | 6.28 | 4 | 1024 | Recursive |
| 222 | 6 | F32 | I64 | bool | 3.14 | 2 | 32768 | Recursive |
| 223 | 6 | F32 | I64 | bool | 6.28 | 2 | 32768 | Recursive |
| 224 | 6 | F32 | I64 | bool | 3.14 | 3 | 32768 | Recursive |
| 225 | 6 | F32 | I64 | bool | 6.28 | 3 | 32768 | Recursive |
| 226 | 6 | F32 | I64 | bool | 3.14 | 4 | 32768 | Recursive |
| 227 | 6 | F32 | I64 | bool | 6.28 | 4 | 32768 | Recursive |
| 228 | 6 | F32 | I64 | bool | 3.14 | 2 | 1048576 | Recursive |
| 229 | 6 | F32 | I64 | bool | 6.28 | 2 | 1048576 | Recursive |
| 230 | 6 | F32 | I64 | bool | 3.14 | 3 | 1048576 | Recursive |
| 231 | 6 | F32 | I64 | bool | 6.28 | 3 | 1048576 | Recursive |
| 232 | 6 | F32 | I64 | bool | 3.14 | 4 | 1048576 | Recursive |
| 233 | 6 | F32 | I64 | bool | 6.28 | 4 | 1048576 | Recursive |
| 234 | 6 | F32 | I64 | bool | 3.14 | 2 | 1024 | Iterative |
| 235 | 6 | F32 | I64 | bool | 6.28 | 2 | 1024 | Iterative |
| 236 | 6 | F32 | I64 | bool | 3.14 | 3 | 1024 | Iterative |
| 237 | 6 | F32 | I64 | bool | 6.28 | 3 | 1024 | Iterative |
| 238 | 6 | F32 | I64 | bool | 3.14 | 4 | 1024 | Iterative |
| 239 | 6 | F32 | I64 | bool | 6.28 | 4 | 1024 | Iterative |
| 240 | 6 | F32 | I64 | bool | 3.14 | 2 | 32768 | Iterative |
| 241 | 6 | F32 | I64 | bool | 6.28 | 2 | 32768 | Iterative |
| 242 | 6 | F32 | I64 | bool | 3.14 | 3 | 32768 | Iterative |
| 243 | 6 | F32 | I64 | bool | 6.28 | 3 | 32768 | Iterative |
| 244 | 6 | F32 | I64 | bool | 3.14 | 4 | 32768 | Iterative |
| 245 | 6 | F32 | I64 | bool | 6.28 | 4 | 32768 | Iterative |
| 246 | 6 | F32 | I64 | bool | 3.14 | 2 | 1048576 | Iterative |
| 247 | 6 | F32 | I64 | bool | 6.28 | 2 | 1048576 | Iterative |
| 248 | 6 | F32 | I64 | bool | 3.14 | 3 | 1048576 | Iterative |
| 249 | 6 | F32 | I64 | bool | 6.28 | 3 | 1048576 | Iterative |
| 250 | 6 | F32 | I64 | bool | 3.14 | 4 | 1048576 | Iterative |
| 251 | 6 | F32 | I64 | bool | 6.28 | 4 | 1048576 | Iterative |
| 216 | 6 | F64 | I64 | void | 3.14 | 2 | 1024 | Recursive |
| 217 | 6 | F64 | I64 | void | 6.28 | 2 | 1024 | Recursive |
| 218 | 6 | F64 | I64 | void | 3.14 | 3 | 1024 | Recursive |
| 219 | 6 | F64 | I64 | void | 6.28 | 3 | 1024 | Recursive |
| 220 | 6 | F64 | I64 | void | 3.14 | 4 | 1024 | Recursive |
| 221 | 6 | F64 | I64 | void | 6.28 | 4 | 1024 | Recursive |
| 222 | 6 | F64 | I64 | void | 3.14 | 2 | 32768 | Recursive |
| 223 | 6 | F64 | I64 | void | 6.28 | 2 | 32768 | Recursive |
| 224 | 6 | F64 | I64 | void | 3.14 | 3 | 32768 | Recursive |
| 225 | 6 | F64 | I64 | void | 6.28 | 3 | 32768 | Recursive |
| 226 | 6 | F64 | I64 | void | 3.14 | 4 | 32768 | Recursive |
| 227 | 6 | F64 | I64 | void | 6.28 | 4 | 32768 | Recursive |
| 228 | 6 | F64 | I64 | void | 3.14 | 2 | 1048576 | Recursive |
| 229 | 6 | F64 | I64 | void | 6.28 | 2 | 1048576 | Recursive |
| 230 | 6 | F64 | I64 | void | 3.14 | 3 | 1048576 | Recursive |
| 231 | 6 | F64 | I64 | void | 6.28 | 3 | 1048576 | Recursive |
| 232 | 6 | F64 | I64 | void | 3.14 | 4 | 1048576 | Recursive |
| 233 | 6 | F64 | I64 | void | 6.28 | 4 | 1048576 | Recursive |
| 234 | 6 | F64 | I64 | void | 3.14 | 2 | 1024 | Iterative |
| 235 | 6 | F64 | I64 | void | 6.28 | 2 | 1024 | Iterative |
| 236 | 6 | F64 | I64 | void | 3.14 | 3 | 1024 | Iterative |
| 237 | 6 | F64 | I64 | void | 6.28 | 3 | 1024 | Iterative |
| 238 | 6 | F64 | I64 | void | 3.14 | 4 | 1024 | Iterative |
| 239 | 6 | F64 | I64 | void | 6.28 | 4 | 1024 | Iterative |
| 240 | 6 | F64 | I64 | void | 3.14 | 2 | 32768 | Iterative |
| 241 | 6 | F64 | I64 | void | 6.28 | 2 | 32768 | Iterative |
| 242 | 6 | F64 | I64 | void | 3.14 | 3 | 32768 | Iterative |
| 243 | 6 | F64 | I64 | void | 6.28 | 3 | 32768 | Iterative |
| 244 | 6 | F64 | I64 | void | 3.14 | 4 | 32768 | Iterative |
| 245 | 6 | F64 | I64 | void | 6.28 | 4 | 32768 | Iterative |
| 246 | 6 | F64 | I64 | void | 3.14 | 2 | 1048576 | Iterative |
| 247 | 6 | F64 | I64 | void | 6.28 | 2 | 1048576 | Iterative |
| 248 | 6 | F64 | I64 | void | 3.14 | 3 | 1048576 | Iterative |
| 249 | 6 | F64 | I64 | void | 6.28 | 3 | 1048576 | Iterative |
| 250 | 6 | F64 | I64 | void | 3.14 | 4 | 1048576 | Iterative |
| 251 | 6 | F64 | I64 | void | 6.28 | 4 | 1048576 | Iterative |
| 252 | 7 | F64 | I64 | bool | 3.14 | 2 | 1024 | Recursive |
| 253 | 7 | F64 | I64 | bool | 6.28 | 2 | 1024 | Recursive |
| 254 | 7 | F64 | I64 | bool | 3.14 | 3 | 1024 | Recursive |