ore_encoding_rs/
ranges.rs

1use crate::{OrePlaintext, OrePlaintextOps};
2
3pub struct OreRange<T> where T: OrePlaintextOps {
4    pub min: OrePlaintext<T>,
5    pub max: OrePlaintext<T>,
6}
7
8pub fn encode_between<T>(min: OrePlaintext<T>, max: OrePlaintext<T>) -> OreRange<T> where T: OrePlaintextOps {
9    OreRange{ min, max }
10}
11
12pub fn encode_lt<T>(value: OrePlaintext<T>) -> OreRange<T> where T: OrePlaintextOps {
13    let OrePlaintext(upper) = value;
14    OreRange{
15        min: OrePlaintext(T::min_value()),
16        max: OrePlaintext(
17            T::max(upper - T::one(), T::min_value())
18        )
19    }
20}
21
22pub fn encode_lte<T>(value: OrePlaintext<T>) -> OreRange<T> where T: OrePlaintextOps {
23    OreRange{ min: OrePlaintext(T::min_value()), max: value }
24}
25
26pub fn encode_gt<T>(value: OrePlaintext<T>) -> OreRange<T> where T: OrePlaintextOps {
27    let OrePlaintext(lower) = value;
28    OreRange{
29        min: OrePlaintext(
30            T::min(lower + T::one(), T::max_value())
31        ),
32        max: OrePlaintext(T::max_value())
33     }
34}
35
36pub fn encode_gte<T>(value: OrePlaintext<T>) -> OreRange<T> where T: OrePlaintextOps {
37    OreRange{ min: value, max: OrePlaintext(T::max_value()) }
38}
39
40pub fn encode_eq<T>(value: OrePlaintext<T>) -> OreRange<T> where T: OrePlaintextOps {
41    OreRange{ min: value, max: value }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47    use crate::OrePlaintext;
48
49    #[test]
50    fn test_encode_eq() -> () {
51        let pt = OrePlaintext(0u64);
52        let range = encode_eq(pt);
53        assert_eq!(range.min, range.max)
54    }
55
56    #[test]
57    fn test_encode_lt() -> () {
58        let pt = OrePlaintext(100u64);
59        let range = encode_lt(pt);
60        assert_eq!(range.min, OrePlaintext(0u64));
61        assert_eq!(range.max, OrePlaintext(99u64))
62    }
63
64    #[test]
65    fn test_encode_lte() -> () {
66        let pt = OrePlaintext(100u64);
67        let range = encode_lte(pt);
68        assert_eq!(range.min, OrePlaintext(0u64));
69        assert_eq!(range.max, OrePlaintext(100u64))
70    }
71
72    #[test]
73    fn test_encode_gt() -> () {
74        let pt = OrePlaintext(100u64);
75        let range = encode_gt(pt);
76        assert_eq!(range.min, OrePlaintext(101u64));
77        assert_eq!(range.max, OrePlaintext(std::u64::MAX))
78    }
79
80    #[test]
81    fn test_encode_gte() -> () {
82        let pt = OrePlaintext(100u64);
83        let range = encode_gte(pt);
84        assert_eq!(range.min, OrePlaintext(100u64));
85        assert_eq!(range.max, OrePlaintext(std::u64::MAX))
86    }
87}