use std::vec::Vec;
use derive_more::AsRef;
use gungraun_macros::IntoInner;
use super::{
__internal, CachegrindMetric, CachegrindMetrics, CallgrindMetrics, DhatMetric, DhatMetrics,
Direction, ErrorMetric, EventKind, FlamegraphKind, Limit, ValgrindTool,
};
use crate::EntryPoint;
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Bbv(__internal::InternalTool);
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Cachegrind(__internal::InternalTool);
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Callgrind(__internal::InternalTool);
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Dhat(__internal::InternalTool);
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Drd(__internal::InternalTool);
#[derive(Debug, Clone, Default, IntoInner, AsRef)]
pub struct FlamegraphConfig(__internal::InternalFlamegraphConfig);
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Helgrind(__internal::InternalTool);
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Massif(__internal::InternalTool);
#[derive(Debug, Clone, IntoInner, AsRef)]
pub struct Memcheck(__internal::InternalTool);
#[derive(Debug, Clone, Default, IntoInner, AsRef)]
pub struct OutputFormat(__internal::InternalOutputFormat);
impl Bbv {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(ValgrindTool::BBV, args))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
}
impl Default for Bbv {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::BBV))
}
}
impl Cachegrind {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(
ValgrindTool::Cachegrind,
args,
))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
pub fn format<I, T>(&mut self, cachegrind_metrics: T) -> &mut Self
where
I: Into<CachegrindMetrics>,
T: IntoIterator<Item = I>,
{
let format = self
.0
.output_format
.get_or_insert_with(|| __internal::InternalToolOutputFormat::Cachegrind(Vec::new()));
if let __internal::InternalToolOutputFormat::Cachegrind(items) = format {
items.extend(cachegrind_metrics.into_iter().map(Into::into));
}
self
}
#[deprecated = "Please use Cachegrind::soft_limits instead"]
pub fn limits<T>(&mut self, limits: T) -> &mut Self
where
T: IntoIterator<Item = (CachegrindMetric, f64)>,
{
self.soft_limits(limits)
}
pub fn soft_limits<K, T>(&mut self, soft_limits: T) -> &mut Self
where
K: Into<CachegrindMetrics>,
T: IntoIterator<Item = (K, f64)>,
{
let iter = soft_limits.into_iter().map(|(k, l)| (k.into(), l));
if let Some(__internal::InternalToolRegressionConfig::Cachegrind(config)) =
&mut self.0.regression_config
{
config.soft_limits.extend(iter);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Cachegrind(
__internal::InternalCachegrindRegressionConfig {
soft_limits: iter.collect(),
hard_limits: Vec::default(),
fail_fast: None,
},
));
}
self
}
pub fn hard_limits<K, L, T>(&mut self, hard_limits: T) -> &mut Self
where
K: Into<CachegrindMetrics>,
L: Into<Limit>,
T: IntoIterator<Item = (K, L)>,
{
let iter = hard_limits.into_iter().map(|(k, l)| (k.into(), l.into()));
if let Some(__internal::InternalToolRegressionConfig::Cachegrind(config)) =
&mut self.0.regression_config
{
config.hard_limits.extend(iter);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Cachegrind(
__internal::InternalCachegrindRegressionConfig {
soft_limits: Vec::default(),
hard_limits: iter.collect(),
fail_fast: None,
},
));
}
self
}
pub fn fail_fast(&mut self, value: bool) -> &mut Self {
if let Some(__internal::InternalToolRegressionConfig::Cachegrind(config)) =
&mut self.0.regression_config
{
config.fail_fast = Some(value);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Cachegrind(
__internal::InternalCachegrindRegressionConfig {
soft_limits: Vec::default(),
hard_limits: Vec::default(),
fail_fast: Some(value),
},
));
}
self
}
}
impl Default for Cachegrind {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::Cachegrind))
}
}
impl Callgrind {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(
ValgrindTool::Callgrind,
args,
))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
#[cfg_attr(not(feature = "client_requests_defs"), doc = "```rust,ignore")]
#[cfg_attr(feature = "client_requests_defs", doc = "```rust")]
pub fn entry_point(&mut self, entry_point: EntryPoint) -> &mut Self {
self.0.entry_point = Some(entry_point);
self
}
#[deprecated = "Please use Callgrind::soft_limits instead"]
pub fn limits<T>(&mut self, limits: T) -> &mut Self
where
T: IntoIterator<Item = (EventKind, f64)>,
{
self.soft_limits(limits)
}
pub fn soft_limits<K, T>(&mut self, soft_limits: T) -> &mut Self
where
K: Into<CallgrindMetrics>,
T: IntoIterator<Item = (K, f64)>,
{
let iter = soft_limits.into_iter().map(|(k, l)| (k.into(), l));
if let Some(__internal::InternalToolRegressionConfig::Callgrind(config)) =
&mut self.0.regression_config
{
config.soft_limits.extend(iter);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Callgrind(
__internal::InternalCallgrindRegressionConfig {
soft_limits: iter.collect(),
hard_limits: Vec::default(),
fail_fast: None,
},
));
}
self
}
pub fn hard_limits<K, L, T>(&mut self, hard_limits: T) -> &mut Self
where
K: Into<CallgrindMetrics>,
L: Into<Limit>,
T: IntoIterator<Item = (K, L)>,
{
let iter = hard_limits.into_iter().map(|(k, l)| (k.into(), l.into()));
if let Some(__internal::InternalToolRegressionConfig::Callgrind(config)) =
&mut self.0.regression_config
{
config.hard_limits.extend(iter);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Callgrind(
__internal::InternalCallgrindRegressionConfig {
soft_limits: Vec::default(),
hard_limits: iter.collect(),
fail_fast: None,
},
));
}
self
}
pub fn fail_fast(&mut self, value: bool) -> &mut Self {
if let Some(__internal::InternalToolRegressionConfig::Callgrind(config)) =
&mut self.0.regression_config
{
config.fail_fast = Some(value);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Callgrind(
__internal::InternalCallgrindRegressionConfig {
soft_limits: Vec::default(),
hard_limits: Vec::default(),
fail_fast: Some(value),
},
));
}
self
}
pub fn flamegraph<T>(&mut self, flamegraph: T) -> &mut Self
where
T: Into<__internal::InternalFlamegraphConfig>,
{
self.0.flamegraph_config = Some(__internal::InternalToolFlamegraphConfig::Callgrind(
flamegraph.into(),
));
self
}
pub fn format<I, T>(&mut self, callgrind_metrics: T) -> &mut Self
where
I: Into<CallgrindMetrics>,
T: IntoIterator<Item = I>,
{
let format = self
.0
.output_format
.get_or_insert_with(|| __internal::InternalToolOutputFormat::Callgrind(Vec::new()));
if let __internal::InternalToolOutputFormat::Callgrind(items) = format {
items.extend(callgrind_metrics.into_iter().map(Into::into));
}
self
}
}
impl Default for Callgrind {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::Callgrind))
}
}
impl Dhat {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(
ValgrindTool::DHAT,
args,
))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
pub fn format<I, T>(&mut self, kinds: T) -> &mut Self
where
I: Into<DhatMetric>,
T: IntoIterator<Item = I>,
{
let format = self
.0
.output_format
.get_or_insert_with(|| __internal::InternalToolOutputFormat::DHAT(Vec::new()));
if let __internal::InternalToolOutputFormat::DHAT(items) = format {
items.extend(kinds.into_iter().map(Into::into));
}
self
}
#[cfg_attr(not(feature = "client_requests_defs"), doc = "```rust,ignore")]
#[cfg_attr(feature = "client_requests_defs", doc = "```rust")]
pub fn entry_point(&mut self, entry_point: EntryPoint) -> &mut Self {
self.0.entry_point = Some(entry_point);
self
}
pub fn frames<I, T>(&mut self, frames: T) -> &mut Self
where
I: Into<String>,
T: IntoIterator<Item = I>,
{
let this = self.0.frames.get_or_insert_with(Vec::new);
this.extend(frames.into_iter().map(Into::into));
self
}
pub fn soft_limits<K, T>(&mut self, soft_limits: T) -> &mut Self
where
K: Into<DhatMetrics>,
T: IntoIterator<Item = (K, f64)>,
{
let iter = soft_limits.into_iter().map(|(k, l)| (k.into(), l));
if let Some(__internal::InternalToolRegressionConfig::Dhat(config)) =
&mut self.0.regression_config
{
config.soft_limits.extend(iter);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Dhat(
__internal::InternalDhatRegressionConfig {
soft_limits: iter.collect(),
hard_limits: Vec::default(),
fail_fast: None,
},
));
}
self
}
pub fn hard_limits<K, L, T>(&mut self, hard_limits: T) -> &mut Self
where
K: Into<DhatMetrics>,
L: Into<Limit>,
T: IntoIterator<Item = (K, L)>,
{
let iter = hard_limits.into_iter().map(|(k, l)| (k.into(), l.into()));
if let Some(__internal::InternalToolRegressionConfig::Dhat(config)) =
&mut self.0.regression_config
{
config.hard_limits.extend(iter);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Dhat(
__internal::InternalDhatRegressionConfig {
soft_limits: Vec::default(),
hard_limits: iter.collect(),
fail_fast: None,
},
));
}
self
}
pub fn fail_fast(&mut self, value: bool) -> &mut Self {
if let Some(__internal::InternalToolRegressionConfig::Dhat(config)) =
&mut self.0.regression_config
{
config.fail_fast = Some(value);
} else {
self.0.regression_config = Some(__internal::InternalToolRegressionConfig::Dhat(
__internal::InternalDhatRegressionConfig {
soft_limits: Vec::default(),
hard_limits: Vec::default(),
fail_fast: Some(value),
},
));
}
self
}
}
impl Default for Dhat {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::DHAT))
}
}
impl Drd {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(ValgrindTool::DRD, args))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
pub fn format<I, T>(&mut self, kinds: T) -> &mut Self
where
I: Into<ErrorMetric>,
T: IntoIterator<Item = I>,
{
let format = self
.0
.output_format
.get_or_insert_with(|| __internal::InternalToolOutputFormat::DRD(Vec::new()));
if let __internal::InternalToolOutputFormat::DRD(items) = format {
items.extend(kinds.into_iter().map(Into::into));
}
self
}
}
impl Default for Drd {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::DRD))
}
}
impl FlamegraphConfig {
pub fn kind(&mut self, kind: FlamegraphKind) -> &mut Self {
self.0.kind = Some(kind);
self
}
pub fn negate_differential(&mut self, negate_differential: bool) -> &mut Self {
self.0.negate_differential = Some(negate_differential);
self
}
pub fn normalize_differential(&mut self, normalize_differential: bool) -> &mut Self {
self.0.normalize_differential = Some(normalize_differential);
self
}
pub fn event_kinds<T>(&mut self, event_kinds: T) -> &mut Self
where
T: IntoIterator<Item = EventKind>,
{
self.0.event_kinds = Some(event_kinds.into_iter().collect());
self
}
pub fn direction(&mut self, direction: Direction) -> &mut Self {
self.0.direction = Some(direction);
self
}
pub fn title(&mut self, title: String) -> &mut Self {
self.0.title = Some(title);
self
}
pub fn subtitle(&mut self, subtitle: String) -> &mut Self {
self.0.subtitle = Some(subtitle);
self
}
pub fn min_width(&mut self, min_width: f64) -> &mut Self {
self.0.min_width = Some(min_width);
self
}
}
impl Helgrind {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(
ValgrindTool::Helgrind,
args,
))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
pub fn format<I, T>(&mut self, kinds: T) -> &mut Self
where
I: Into<ErrorMetric>,
T: IntoIterator<Item = I>,
{
let format = self
.0
.output_format
.get_or_insert_with(|| __internal::InternalToolOutputFormat::Helgrind(Vec::new()));
if let __internal::InternalToolOutputFormat::Helgrind(items) = format {
items.extend(kinds.into_iter().map(Into::into));
}
self
}
}
impl Default for Helgrind {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::Helgrind))
}
}
impl Massif {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(
ValgrindTool::Massif,
args,
))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
}
impl Default for Massif {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::Massif))
}
}
impl Memcheck {
pub fn with_args<I, T>(args: T) -> Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
Self(__internal::InternalTool::with_args(
ValgrindTool::Memcheck,
args,
))
}
pub fn args<I, T>(&mut self, args: T) -> &mut Self
where
I: AsRef<str>,
T: IntoIterator<Item = I>,
{
self.0.raw_tool_args.extend_ignore_flag(args);
self
}
pub fn enable(&mut self, value: bool) -> &mut Self {
self.0.enable = Some(value);
self
}
pub fn format<I, T>(&mut self, kinds: T) -> &mut Self
where
I: Into<ErrorMetric>,
T: IntoIterator<Item = I>,
{
let format = self
.0
.output_format
.get_or_insert_with(|| __internal::InternalToolOutputFormat::Memcheck(Vec::new()));
if let __internal::InternalToolOutputFormat::Memcheck(items) = format {
items.extend(kinds.into_iter().map(Into::into));
}
self
}
}
impl Default for Memcheck {
fn default() -> Self {
Self(__internal::InternalTool::new(ValgrindTool::Memcheck))
}
}
impl OutputFormat {
pub fn truncate_description(&mut self, value: Option<usize>) -> &mut Self {
self.0.truncate_description = Some(value);
self
}
pub fn show_intermediate(&mut self, value: bool) -> &mut Self {
self.0.show_intermediate = Some(value);
self
}
pub fn show_grid(&mut self, value: bool) -> &mut Self {
self.0.show_grid = Some(value);
self
}
pub fn tolerance(&mut self, value: f64) -> &mut Self {
self.0.tolerance = Some(value);
self
}
}