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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::{EncodeValue, Result, Tagged};
use core::cmp::Ordering;
pub trait DerOrd {
fn der_cmp(&self, other: &Self) -> Result<Ordering>;
}
pub trait ValueOrd {
fn value_cmp(&self, other: &Self) -> Result<Ordering>;
}
impl<T> DerOrd for T
where
T: EncodeValue + ValueOrd + Tagged,
{
fn der_cmp(&self, other: &Self) -> Result<Ordering> {
match self.header()?.der_cmp(&other.header()?)? {
Ordering::Equal => self.value_cmp(other),
ordering => Ok(ordering),
}
}
}
pub trait OrdIsValueOrd: Ord {}
impl<T> ValueOrd for T
where
T: OrdIsValueOrd,
{
fn value_cmp(&self, other: &Self) -> Result<Ordering> {
Ok(self.cmp(other))
}
}
pub(crate) fn iter_cmp<'a, I, T: 'a>(a: I, b: I) -> Result<Ordering>
where
I: Iterator<Item = &'a T> + ExactSizeIterator,
T: DerOrd,
{
let length_ord = a.len().cmp(&b.len());
for (value1, value2) in a.zip(b) {
match value1.der_cmp(value2)? {
Ordering::Equal => (),
other => return Ok(other),
}
}
Ok(length_ord)
}