2525#include < fmt/format.h>
2626
2727#include < algorithm>
28- #include < functional>
29- #include < memory>
3028#include < stdexcept>
3129#include < string>
3230
3331namespace nvbench
3432{
3533
36- struct state ::bench_ref_impl
37- {
38- explicit bench_ref_impl (const benchmark_base &bench)
39- : m_benchmark{bench}
40- {}
41-
42- std::reference_wrapper<const benchmark_base> m_benchmark;
43- };
44-
4534state::state (const benchmark_base &bench)
46- : m_benchmark_wrapper{std::make_unique<bench_ref_impl>( bench) }
35+ : m_benchmark_ptr{& bench}
4736 , m_is_cpu_only(bench.get_is_cpu_only())
4837 , m_run_once{bench.get_run_once ()}
4938 , m_disable_blocking_kernel{bench.get_disable_blocking_kernel ()}
@@ -61,7 +50,7 @@ state::state(const benchmark_base &bench,
6150 nvbench::named_values values,
6251 std::optional<nvbench::device_info> device,
6352 std::size_t type_config_index)
64- : m_benchmark_wrapper{std::make_unique<bench_ref_impl>( bench) }
53+ : m_benchmark_ptr{& bench}
6554 , m_axis_values{std::move (values)}
6655 , m_device{std::move (device)}
6756 , m_type_config_index{type_config_index}
@@ -79,17 +68,7 @@ state::state(const benchmark_base &bench,
7968 , m_cuda_stream{std::nullopt }
8069{}
8170
82- // Destructor and move-constructor, move-assignment must be defined in C++ file
83- // where benchmark_base type definition is known to be complete. See #235
84- state::state (state &&) = default ;
85- state &state::operator =(state &&) = default ;
86-
87- state::~state () = default ;
88-
89- const nvbench::benchmark_base &state::get_benchmark () const
90- {
91- return m_benchmark_wrapper->m_benchmark .get ();
92- }
71+ const nvbench::benchmark_base &state::get_benchmark () const { return *m_benchmark_ptr; }
9372
9473nvbench::int64_t state::get_int64 (const std::string &axis_name) const
9574{
@@ -228,7 +207,7 @@ std::string state::get_axis_values_as_string(bool color) const
228207 append_key_value (" Device" , m_device->get_id ());
229208 }
230209
231- const axes_metadata &axes = m_benchmark_wrapper-> m_benchmark . get (). get_axes ();
210+ const axes_metadata &axes = m_benchmark_ptr-> get_axes ();
232211 for (const auto &name : m_axis_values.get_names ())
233212 {
234213 const auto axis_type = m_axis_values.get_type (name);
@@ -265,9 +244,7 @@ std::string state::get_short_description(bool color) const
265244 };
266245
267246 return fmt::format (" {} [{}]" ,
268- fmt::format (style (fmt::emphasis::bold),
269- " {}" ,
270- m_benchmark_wrapper->m_benchmark .get ().get_name ()),
247+ fmt::format (style (fmt::emphasis::bold), " {}" , m_benchmark_ptr->get_name ()),
271248 this ->get_axis_values_as_string (color));
272249}
273250
0 commit comments