Clean up some virtual interfaces.

- nvbench::benchmark doesn't add state, no need to override the destructor.
- nvbench::printer_base's virtual API should support decoration, not just
  overriding. Making the virtual API protected instead of private allows
  derived classes to extend base class behavior.
- nvbench::printer_base needs a virtual destructor.
- Fix a bug in nvbench::printer_multiplex that caused the new
  `get_[total|completed]_state_count()` methods to always return 0.
This commit is contained in:
Allison Vacanti
2021-12-19 10:26:40 -05:00
parent 3508775d71
commit 37dd61b275
8 changed files with 40 additions and 35 deletions

View File

@@ -64,11 +64,6 @@ struct benchmark final : public benchmark_base
: benchmark_base(type_axes{})
{}
// Note that this inline virtual dtor may cause vtable issues if linking
// benchmark TUs together. That's not a likely scenario, so we'll deal with
// that if it comes up.
~benchmark() override = default;
private:
std::unique_ptr<benchmark_base> do_clone() const final
{

View File

@@ -30,7 +30,7 @@ struct csv_printer : nvbench::printer_base
{
using printer_base::printer_base;
private:
protected:
// Virtual API from printer_base:
void do_print_benchmark_results(const benchmark_vector &benches) override;
};

View File

@@ -30,7 +30,7 @@ struct json_printer : nvbench::printer_base
{
using printer_base::printer_base;
private:
protected:
// Virtual API from printer_base:
void do_print_benchmark_results(const benchmark_vector &benches) override;
};

View File

@@ -50,7 +50,7 @@ struct markdown_printer : nvbench::printer_base
[[nodiscard]] bool get_color() const { return m_color; }
/*!@}*/
private:
protected:
// Virtual API from printer_base:
void do_print_device_info() override;
void do_print_log_preamble() override;

View File

@@ -56,7 +56,7 @@ struct printer_base
* Construct a new printer_base that will write to ostream.
*/
explicit printer_base(std::ostream &ostream);
~printer_base();
virtual ~printer_base();
// move-only
printer_base(const printer_base &) = delete;
@@ -141,12 +141,6 @@ struct printer_base
/*!@}*/
protected:
std::ostream &m_ostream;
std::size_t m_completed_state_count{};
std::size_t m_total_state_count{};
private:
// Implementation hooks for subclasses:
virtual void do_print_device_info() {}
virtual void do_print_log_preamble() {}
@@ -156,24 +150,17 @@ private:
virtual void do_print_benchmark_list(const benchmark_vector &) {}
virtual void do_print_benchmark_results(const benchmark_vector &) {}
virtual void do_set_completed_state_count(std::size_t states)
{
m_completed_state_count = states;
}
virtual void do_add_completed_state() { ++m_completed_state_count; }
[[nodiscard]] virtual std::size_t do_get_completed_state_count() const
{
return m_completed_state_count;
}
virtual void do_set_completed_state_count(std::size_t states);
virtual void do_add_completed_state();
[[nodiscard]] virtual std::size_t do_get_completed_state_count() const;
virtual void do_set_total_state_count(std::size_t states)
{
m_total_state_count = states;
}
[[nodiscard]] virtual std::size_t do_get_total_state_count() const
{
return m_total_state_count;
}
virtual void do_set_total_state_count(std::size_t states);
[[nodiscard]] virtual std::size_t do_get_total_state_count() const;
std::ostream &m_ostream;
std::size_t m_completed_state_count{};
std::size_t m_total_state_count{};
};
} // namespace nvbench

View File

@@ -30,4 +30,26 @@ printer_base::printer_base(std::ostream &ostream)
// Defined here to keep <ostream> out of the header
printer_base::~printer_base() = default;
void printer_base::do_set_completed_state_count(std::size_t states)
{
m_completed_state_count = states;
}
void printer_base::do_add_completed_state() { ++m_completed_state_count; }
std::size_t printer_base::do_get_completed_state_count() const
{
return m_completed_state_count;
}
void printer_base::do_set_total_state_count(std::size_t states)
{
m_total_state_count = states;
}
std::size_t printer_base::do_get_total_state_count() const
{
return m_total_state_count;
}
} // namespace nvbench

View File

@@ -31,7 +31,6 @@ namespace nvbench
*/
struct printer_multiplex : nvbench::printer_base
{
printer_multiplex();
template <typename Format, typename... Ts>
@@ -46,7 +45,7 @@ struct printer_multiplex : nvbench::printer_base
return m_printers.size();
}
private:
protected:
void do_print_device_info() override;
void do_print_log_preamble() override;
void do_print_log_epilogue() override;
@@ -54,7 +53,6 @@ private:
void do_log_run_state(const nvbench::state &) override;
void do_print_benchmark_list(const benchmark_vector &benches) override;
void do_print_benchmark_results(const benchmark_vector &benches) override;
void do_set_completed_state_count(std::size_t states) override;
void do_add_completed_state() override;
void do_set_total_state_count(std::size_t states) override;

View File

@@ -85,6 +85,7 @@ void printer_multiplex::do_print_benchmark_results(
}
void printer_multiplex::do_set_completed_state_count(std::size_t states)
{
printer_base::do_set_completed_state_count(states);
for (auto &format_ptr : m_printers)
{
format_ptr->set_completed_state_count(states);
@@ -93,6 +94,7 @@ void printer_multiplex::do_set_completed_state_count(std::size_t states)
void printer_multiplex::do_add_completed_state()
{
printer_base::do_add_completed_state();
for (auto &format_ptr : m_printers)
{
format_ptr->add_completed_state();
@@ -101,6 +103,7 @@ void printer_multiplex::do_add_completed_state()
void printer_multiplex::do_set_total_state_count(std::size_t states)
{
printer_base::do_set_total_state_count(states);
for (auto &format_ptr : m_printers)
{
format_ptr->set_total_state_count(states);