tantivy_sstable/value/
range.rs1use std::io;
2use std::ops::Range;
3
4use crate::value::{deserialize_vint_u64, ValueReader, ValueWriter};
5
6#[derive(Default)]
8pub struct RangeValueReader {
9 vals: Vec<Range<u64>>,
10}
11
12impl ValueReader for RangeValueReader {
13 type Value = Range<u64>;
14
15 #[inline(always)]
16 fn value(&self, idx: usize) -> &Range<u64> {
17 &self.vals[idx]
18 }
19
20 fn load(&mut self, mut data: &[u8]) -> io::Result<usize> {
21 self.vals.clear();
22 let original_num_bytes = data.len();
23 let len = deserialize_vint_u64(&mut data) as usize;
24 if len != 0 {
25 let mut prev_val = deserialize_vint_u64(&mut data);
26 for _ in 1..len {
27 let next_val = prev_val + deserialize_vint_u64(&mut data);
28 self.vals.push(prev_val..next_val);
29 prev_val = next_val;
30 }
31 }
32 Ok(original_num_bytes - data.len())
33 }
34}
35
36#[derive(Default)]
48pub struct RangeValueWriter {
49 vals: Vec<u64>,
50}
51
52impl ValueWriter for RangeValueWriter {
53 type Value = Range<u64>;
54
55 fn write(&mut self, val: &Range<u64>) {
56 if let Some(previous_offset) = self.vals.last().copied() {
57 assert_eq!(previous_offset, val.start);
58 self.vals.push(val.end);
59 } else {
60 self.vals.push(val.start);
61 self.vals.push(val.end)
62 }
63 }
64
65 fn serialize_block(&self, writer: &mut Vec<u8>) {
66 let mut prev_val = 0u64;
67 crate::vint::serialize_into_vec(self.vals.len() as u64, writer);
68 for &val in &self.vals {
69 let delta = val - prev_val;
70 crate::vint::serialize_into_vec(delta, writer);
71 prev_val = val;
72 }
73 }
74
75 fn clear(&mut self) {
76 self.vals.clear();
77 }
78}
79
80#[cfg(test)]
81mod tests {
82 use super::*;
83
84 #[test]
85 fn test_range_reader_writer() {
86 crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[]);
87 crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
88 0..3,
89 ]);
90 crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
91 0..3,
92 3..10,
93 ]);
94 crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
95 0..0,
96 0..10,
97 ]);
98 crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
99 100..110,
100 110..121,
101 121..1250,
102 ]);
103 }
104
105 #[test]
106 #[should_panic]
107 fn test_range_reader_writer_panics() {
108 crate::value::tests::test_value_reader_writer::<_, RangeValueReader, RangeValueWriter>(&[
109 1..3,
110 4..10,
111 ]);
112 }
113}