Skip to main content

rs_teststand/expression/function/
array.rs

1//! Array expression functions.
2
3/// A array function of the expression language.
4///
5/// Names only: what each one computes is the engine's to document.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum ArrayFunction {
8    /// `Contains`.
9    Contains,
10    /// `FindIndex`.
11    FindIndex,
12    /// `FindOffset`.
13    FindOffset,
14    /// `GetArrayBounds`.
15    GetArrayBounds,
16    /// `GetNumElements`.
17    GetNumElements,
18    /// `IndexToOffset`.
19    IndexToOffset,
20    /// `InsertElements`.
21    InsertElements,
22    /// `OffsetToIndex`.
23    OffsetToIndex,
24    /// `RemoveElements`.
25    RemoveElements,
26    /// `SetArrayBounds`.
27    SetArrayBounds,
28    /// `SetElements`.
29    SetElements,
30    /// `SetNumElements`.
31    SetNumElements,
32    /// `Sort`.
33    Sort,
34}
35
36impl ArrayFunction {
37    /// Every function in this family.
38    pub const ALL: [Self; 13] = [
39        Self::Contains,
40        Self::FindIndex,
41        Self::FindOffset,
42        Self::GetArrayBounds,
43        Self::GetNumElements,
44        Self::IndexToOffset,
45        Self::InsertElements,
46        Self::OffsetToIndex,
47        Self::RemoveElements,
48        Self::SetArrayBounds,
49        Self::SetElements,
50        Self::SetNumElements,
51        Self::Sort,
52    ];
53
54    /// The name as written in an expression.
55    #[must_use]
56    pub const fn name(self) -> &'static str {
57        match self {
58            Self::Contains => "Contains",
59            Self::FindIndex => "FindIndex",
60            Self::FindOffset => "FindOffset",
61            Self::GetArrayBounds => "GetArrayBounds",
62            Self::GetNumElements => "GetNumElements",
63            Self::IndexToOffset => "IndexToOffset",
64            Self::InsertElements => "InsertElements",
65            Self::OffsetToIndex => "OffsetToIndex",
66            Self::RemoveElements => "RemoveElements",
67            Self::SetArrayBounds => "SetArrayBounds",
68            Self::SetElements => "SetElements",
69            Self::SetNumElements => "SetNumElements",
70            Self::Sort => "Sort",
71        }
72    }
73}
74
75#[cfg(test)]
76mod tests {
77    use super::ArrayFunction;
78
79    #[test]
80    fn every_name_is_distinct() {
81        let mut names: Vec<&str> = ArrayFunction::ALL.iter().map(|f| f.name()).collect();
82        names.sort_unstable();
83        let count = names.len();
84        names.dedup();
85        assert_eq!(names.len(), count);
86    }
87}