1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use crate::common::dive_segment;
use crate::common::dive_segment::DiveSegment;
use crate::common::gas::Gas;
use crate::deco::tissue::Tissue;
use std::fmt::Debug;

/// Trait for decompression models. This trait must be implemented for any custom decompression

/// algorithms if they are to be used in dive plans with the [`DivePlan`] trait.

pub trait DecoAlgorithm: Copy + Clone + Debug {
    /// Apply a segment to the deco model.

    /// # Arguments

    /// * `segment` - DiveSegment to apply.

    /// * `gas` - Gas that is being consumed in this segment.

    /// * `metres_per_bar` - Depth of water required to induce 1 bar of pressure.

    fn add_dive_segment(&mut self, segment: &DiveSegment, gas: &Gas, metres_per_bar: f64);

    /// Surface the deco model, returning the mandatory decompression stops / remaining no-decompression

    /// time along the way.

    /// # Arguments

    /// * `ascent_rate` - Ascent rate to use during stops

    /// * `descent_rate` - Ascent rate to use during stops

    fn surface(
        &mut self,
        ascent_rate: isize,
        descent_rate: isize,
        gas: &Gas,
        metres_per_bar: f64,
    ) -> Vec<dive_segment::DiveSegment>;

    /// Get the tissue loadings of the model

    fn get_tissue(&self) -> Tissue;

    /// Get the decompression stops required to surface the model. This is identical to `surface`

    /// but it does not modify the original model in any way.

    fn get_stops(
        &self,
        ascent_rate: isize,
        descent_rate: isize,
        gas: &Gas,
        metres_per_bar: f64,
    ) -> Vec<dive_segment::DiveSegment> {
        let mut virtual_deco = *self;
        virtual_deco.surface(ascent_rate, descent_rate, gas, metres_per_bar)
    }
}