orx_v/dim/index_card/equality.rs
1use crate::dim::Dim;
2use core::fmt::Debug;
3use core::fmt::Display;
4
5/// Result of an [`equality`] check of two vectors of the same dimension.
6///
7/// The result can be
8/// * [`Equality::Equal`] iff the cardinality of the structures as
9/// well as all values at corresponding positions are equal.
10/// * [`Equality::UnequalCard`] if cardinalities do not agree at at least one
11/// level.
12/// * [`Equality::UnequalValue`] if any of the values are different.
13///
14/// [`equality`]: crate::NVec::equality
15#[derive(PartialEq, Eq, Clone, Copy)]
16pub enum Equality<D: Dim> {
17 /// Cardinality of the structures as well as all values at corresponding positions are equal.
18 Equal,
19 /// Cardinalities do not agree at at least one level.
20 /// The tuple `(idx, card1, card2)` represents the following:
21 /// * `idx` is the place the inequality in cardinalities are observed;
22 /// * `card1` and `card2` are the unequal cardinalities at the given `idx` in the first and
23 /// second vectors, respectively.
24 UnequalCard(D::CardIdx, usize, usize),
25 /// Values of at least one of the element is different.
26 /// The `(idx)` represents the index where the value inequality is observed.
27 UnequalValue(D::Idx),
28}
29
30impl<D: Dim> Debug for Equality<D> {
31 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
32 match self {
33 Self::Equal => write!(f, "Equal"),
34 Self::UnequalCard(idx, x, y) => {
35 write!(
36 f,
37 "UnequalCard {{ idx: {:?}, lhs.card({:?}): {:?}, rhs.card({:?}): {:?} }}",
38 idx, idx, x, idx, y
39 )
40 }
41 Self::UnequalValue(idx) => {
42 write!(f, "UnequalValue {{ idx: {:?} }}", idx)
43 }
44 }
45 }
46}
47
48impl<D: Dim> Display for Equality<D> {
49 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
50 write!(f, "{:?}", self)
51 }
52}
53
54// #[cfg(test)]
55// mod tests {
56// use crate::{dim::Equality, IdxLeqD0, IdxLeqD1, IdxLeqD2, IdxLeqD3, NVec, NVecCoreSealed};
57// use alloc::vec;
58
59// #[test]
60// fn eq_d1() {
61// let v1 = vec![1, 2, 3];
62// let v2 = vec![1, 2, 3];
63
64// assert_eq!(v1.equality(&v2), Equality::Equal);
65// assert_eq!(v2.equality(&v1), Equality::Equal);
66// }
67
68// #[test]
69// fn eq_d2() {
70// let v1 = vec![vec![1, 2], vec![1, 2, 3]];
71// let v2 = vec![vec![1, 2], vec![1, 2, 3]];
72
73// assert_eq!(v1.equality(&v2), Equality::Equal);
74// }
75
76// #[test]
77// fn eq_d3() {
78// let v1 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
79// let v2 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
80
81// assert_eq!(v1.equality(&v2), Equality::Equal);
82// }
83
84// #[test]
85// fn eq_d4() {
86// let v1 = vec![
87// vec![
88// vec![vec![1, 2, 3, 4]],
89// vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
90// ],
91// vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
92// ];
93// let v2 = vec![
94// vec![
95// vec![vec![1, 2, 3, 4]],
96// vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
97// ],
98// vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
99// ];
100
101// assert_eq!(v1.equality(&v2), Equality::Equal);
102// }
103
104// #[test]
105// fn ineq_card_d1() {
106// let v1 = vec![1, 2, 3];
107// let v2 = vec![1, 2, 3, 4];
108
109// assert_eq!(
110// v1.equality(&v2),
111// Equality::UnequalCard(IdxLeqD0::IdxD0([]), 3, 4)
112// );
113// }
114
115// #[test]
116// fn ineq_card_d2() {
117// let v1 = vec![vec![1, 2], vec![1, 2, 3, 4]];
118// let v2 = vec![vec![1, 2], vec![1, 2, 3]];
119
120// assert_eq!(
121// v1.equality(&v2),
122// Equality::UnequalCard(IdxLeqD1::IdxD1([1]), 4, 3)
123// );
124// }
125
126// #[test]
127// fn ineq_card_d3() {
128// let v1 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
129// let v2 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]], vec![]];
130
131// assert_eq!(
132// v1.equality(&v2),
133// Equality::UnequalCard(IdxLeqD2::IdxD0([]), 2, 3)
134// );
135// }
136
137// #[test]
138// fn ineq_card_d4() {
139// let v1 = vec![
140// vec![
141// vec![vec![1, 2, 3, 4]],
142// vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
143// ],
144// vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
145// ];
146// let v2 = vec![
147// vec![
148// vec![vec![1, 2, 3, 4]],
149// vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
150// ],
151// vec![vec![], vec![vec![], vec![1, 2], vec![1, 2, 3]]],
152// ];
153
154// assert_eq!(
155// v1.equality(&v2),
156// Equality::UnequalCard(IdxLeqD3::IdxD1([1]), 1, 2)
157// );
158// }
159
160// #[test]
161// fn ineq_val_d1() {
162// let v1 = vec![1, 2, 3];
163// let v2 = vec![1, 22, 3];
164
165// assert_eq!(v1.equality(&v2), Equality::UnequalValue([1]));
166// }
167
168// #[test]
169// fn ineq_val_d2() {
170// let v1 = vec![vec![1, 2], vec![1, 2, 3]];
171// let v2 = vec![vec![1, 2], vec![1, 42, 3]];
172
173// assert_eq!(v1.equality(&v2), Equality::UnequalValue([1, 1]));
174// }
175
176// #[test]
177// fn ineq_val_d3() {
178// let v1 = vec![vec![vec![1], vec![1, 2]], vec![vec![1, 2, 3]]];
179// let v2 = vec![vec![vec![1], vec![1, 2]], vec![vec![42, 2, 3]]];
180
181// assert_eq!(v1.equality(&v2), Equality::UnequalValue([1, 0, 0]));
182// }
183
184// #[test]
185// fn ineq_val_d4() {
186// let v1 = vec![
187// vec![
188// vec![vec![1, 2, 3, 4]],
189// vec![vec![1, 2], vec![1, 2, 3, 4, 5]],
190// ],
191// vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
192// ];
193// let v2 = vec![
194// vec![
195// vec![vec![1, 2, 3, 4]],
196// vec![vec![1, 2], vec![1, 2, 42, 4, 5]],
197// ],
198// vec![vec![vec![], vec![1, 2], vec![1, 2, 3]]],
199// ];
200
201// assert_eq!(v1.equality(&v2), Equality::UnequalValue([0, 1, 1, 2]));
202// }
203// }