summaryrefslogtreecommitdiffstats
path: root/vendor/criterion-plot/src/candlestick.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/criterion-plot/src/candlestick.rs')
-rwxr-xr-xvendor/criterion-plot/src/candlestick.rs154
1 files changed, 154 insertions, 0 deletions
diff --git a/vendor/criterion-plot/src/candlestick.rs b/vendor/criterion-plot/src/candlestick.rs
new file mode 100755
index 000000000..d1754e8c5
--- /dev/null
+++ b/vendor/criterion-plot/src/candlestick.rs
@@ -0,0 +1,154 @@
+//! "Candlestick" plots
+
+use std::borrow::Cow;
+use std::iter::IntoIterator;
+
+use crate::data::Matrix;
+use crate::traits::{self, Data, Set};
+use crate::{Color, Default, Display, Figure, Label, LineType, LineWidth, Plot, Script};
+
+/// Properties common to candlestick plots
+pub struct Properties {
+ color: Option<Color>,
+ label: Option<Cow<'static, str>>,
+ line_type: LineType,
+ linewidth: Option<f64>,
+}
+
+impl Default for Properties {
+ fn default() -> Properties {
+ Properties {
+ color: None,
+ label: None,
+ line_type: LineType::Solid,
+ linewidth: None,
+ }
+ }
+}
+
+impl Script for Properties {
+ // Allow clippy::format_push_string even with older versions of rust (<1.62) which
+ // don't have it defined.
+ #[allow(clippy::all)]
+ fn script(&self) -> String {
+ let mut script = String::from("with candlesticks ");
+
+ script.push_str(&format!("lt {} ", self.line_type.display()));
+
+ if let Some(lw) = self.linewidth {
+ script.push_str(&format!("lw {} ", lw))
+ }
+
+ if let Some(color) = self.color {
+ script.push_str(&format!("lc rgb '{}' ", color.display()));
+ }
+
+ if let Some(ref label) = self.label {
+ script.push_str("title '");
+ script.push_str(label);
+ script.push('\'')
+ } else {
+ script.push_str("notitle")
+ }
+
+ script
+ }
+}
+
+impl Set<Color> for Properties {
+ /// Sets the line color
+ fn set(&mut self, color: Color) -> &mut Properties {
+ self.color = Some(color);
+ self
+ }
+}
+
+impl Set<Label> for Properties {
+ /// Sets the legend label
+ fn set(&mut self, label: Label) -> &mut Properties {
+ self.label = Some(label.0);
+ self
+ }
+}
+
+impl Set<LineType> for Properties {
+ /// Changes the line type
+ ///
+ /// **Note** By default `Solid` lines are used
+ fn set(&mut self, lt: LineType) -> &mut Properties {
+ self.line_type = lt;
+ self
+ }
+}
+
+impl Set<LineWidth> for Properties {
+ /// Changes the width of the line
+ ///
+ /// # Panics
+ ///
+ /// Panics if `width` is a non-positive value
+ fn set(&mut self, lw: LineWidth) -> &mut Properties {
+ let lw = lw.0;
+
+ assert!(lw > 0.);
+
+ self.linewidth = Some(lw);
+ self
+ }
+}
+
+/// A candlestick consists of a box and two whiskers that extend beyond the box
+pub struct Candlesticks<X, WM, BM, BH, WH> {
+ /// X coordinate of the candlestick
+ pub x: X,
+ /// Y coordinate of the end point of the bottom whisker
+ pub whisker_min: WM,
+ /// Y coordinate of the bottom of the box
+ pub box_min: BM,
+ /// Y coordinate of the top of the box
+ pub box_high: BH,
+ /// Y coordinate of the end point of the top whisker
+ pub whisker_high: WH,
+}
+
+impl<X, WM, BM, BH, WH> traits::Plot<Candlesticks<X, WM, BM, BH, WH>> for Figure
+where
+ BH: IntoIterator,
+ BH::Item: Data,
+ BM: IntoIterator,
+ BM::Item: Data,
+ WH: IntoIterator,
+ WH::Item: Data,
+ WM: IntoIterator,
+ WM::Item: Data,
+ X: IntoIterator,
+ X::Item: Data,
+{
+ type Properties = Properties;
+
+ fn plot<F>(
+ &mut self,
+ candlesticks: Candlesticks<X, WM, BM, BH, WH>,
+ configure: F,
+ ) -> &mut Figure
+ where
+ F: FnOnce(&mut Properties) -> &mut Properties,
+ {
+ let (x_factor, y_factor) = crate::scale_factor(&self.axes, crate::Axes::BottomXLeftY);
+ let Candlesticks {
+ x,
+ whisker_min,
+ box_min,
+ box_high,
+ whisker_high,
+ } = candlesticks;
+
+ let data = Matrix::new(
+ izip!(x, box_min, whisker_min, whisker_high, box_high),
+ (x_factor, y_factor, y_factor, y_factor, y_factor),
+ );
+ self.plots
+ .push(Plot::new(data, configure(&mut Default::default())));
+ self
+ }
+}