1use anyhow::Result;
15use futures::future::BoxFuture;
16
17use crate::benchmark::{Benchmark, BenchmarkDescriptor};
18use crate::metadata::PluginMetadata;
19use crate::params::{ParamSpec, ParamValues};
20use crate::plugin::{Plugin, PluginHandle};
21use crate::result::BenchmarkResult;
22
23pub trait DynBenchmark: Send {
26 fn descriptor(&self) -> &'static BenchmarkDescriptor;
27 fn metadata(&self) -> &'static PluginMetadata;
28 fn parameters(&self) -> Vec<ParamSpec>;
29 fn configure(&mut self, values: &ParamValues) -> Result<()>;
30 fn load<'a>(&'a mut self, handle: PluginHandle) -> BoxFuture<'a, Result<()>>;
31 fn next<'a>(&'a mut self) -> BoxFuture<'a, Result<BenchmarkResult>>;
32 fn cleanup<'a>(&'a mut self) -> BoxFuture<'a, Result<()>>;
33}
34
35impl<T> DynBenchmark for T
36where
37 T: Benchmark + Send,
38{
39 fn descriptor(&self) -> &'static BenchmarkDescriptor {
40 Benchmark::descriptor(self)
41 }
42 fn metadata(&self) -> &'static PluginMetadata {
43 Plugin::metadata(self)
44 }
45 fn parameters(&self) -> Vec<ParamSpec> {
46 Benchmark::parameters(self)
47 }
48 fn configure(&mut self, values: &ParamValues) -> Result<()> {
49 Benchmark::configure(self, values)
50 }
51 fn load<'a>(&'a mut self, handle: PluginHandle) -> BoxFuture<'a, Result<()>> {
52 Box::pin(Plugin::load(self, handle))
53 }
54 fn next<'a>(&'a mut self) -> BoxFuture<'a, Result<BenchmarkResult>> {
55 Box::pin(Benchmark::next(self))
56 }
57 fn cleanup<'a>(&'a mut self) -> BoxFuture<'a, Result<()>> {
58 Box::pin(Benchmark::cleanup(self))
59 }
60}