ore_encoding_rs/
ranges.rs1use 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}