osmpbf_parser/
scan_bytes.rs1use desert::{ToBytes,FromBytes,CountBytes,varint};
2use crate::{ScanTable,Error};
3use std::ops::Bound::Included;
4
5impl ToBytes for ScanTable {
6 fn to_bytes(&self) -> Result<Vec<u8>,Error> {
7 let mut buf = vec![0;self.count_bytes()];
8 self.write_bytes(&mut buf)?;
9 Ok(buf)
10 }
11 fn write_bytes(&self, buf: &mut [u8]) -> Result<usize,Error> {
12 let mut offset = 0;
13 offset += varint::encode(self.node_interval_offsets.len() as u64, &mut buf[offset..])?;
14 for (id_range,(byte_offset,byte_len,item_len)) in self.node_interval_offsets.iter() {
15 if let (Included(low),Included(high)) = id_range {
16 offset += varint::encode(*low as u64, &mut buf[offset..])?;
17 offset += varint::encode(*high as u64, &mut buf[offset..])?;
18 offset += varint::encode(*byte_offset, &mut buf[offset..])?;
19 offset += varint::encode(*byte_len as u64, &mut buf[offset..])?;
20 offset += varint::encode(*item_len as u64, &mut buf[offset..])?;
21 }
22 }
23 offset += varint::encode(self.way_interval_offsets.len() as u64, &mut buf[offset..])?;
24 for (id_range,(byte_offset,byte_len,item_len)) in self.way_interval_offsets.iter() {
25 if let (Included(low),Included(high)) = id_range {
26 offset += varint::encode(*low as u64, &mut buf[offset..])?;
27 offset += varint::encode(*high as u64, &mut buf[offset..])?;
28 offset += varint::encode(*byte_offset, &mut buf[offset..])?;
29 offset += varint::encode(*byte_len as u64, &mut buf[offset..])?;
30 offset += varint::encode(*item_len as u64, &mut buf[offset..])?;
31 }
32 }
33 offset += varint::encode(self.relation_interval_offsets.len() as u64, &mut buf[offset..])?;
34 for (id_range,(byte_offset,byte_len,item_len)) in self.relation_interval_offsets.iter() {
35 if let (Included(low),Included(high)) = id_range {
36 offset += varint::encode(*low as u64, &mut buf[offset..])?;
37 offset += varint::encode(*high as u64, &mut buf[offset..])?;
38 offset += varint::encode(*byte_offset, &mut buf[offset..])?;
39 offset += varint::encode(*byte_len as u64, &mut buf[offset..])?;
40 offset += varint::encode(*item_len as u64, &mut buf[offset..])?;
41 }
42 }
43 Ok(offset)
44 }
45}
46
47impl CountBytes for ScanTable {
48 fn count_bytes(&self) -> usize {
49 let mut size = 0;
50 size += varint::length(self.node_interval_offsets.len() as u64);
51 for (id_range,(byte_offset,byte_len,item_len)) in self.node_interval_offsets.iter() {
52 if let (Included(low),Included(high)) = id_range {
53 size += varint::length(*low as u64);
54 size += varint::length(*high as u64);
55 size += varint::length(*byte_offset);
56 size += varint::length(*byte_len as u64);
57 size += varint::length(*item_len as u64);
58 }
59 }
60 size += varint::length(self.way_interval_offsets.len() as u64);
61 for (id_range,(byte_offset,byte_len,item_len)) in self.way_interval_offsets.iter() {
62 if let (Included(low),Included(high)) = id_range {
63 size += varint::length(*low as u64);
64 size += varint::length(*high as u64);
65 size += varint::length(*byte_offset);
66 size += varint::length(*byte_len as u64);
67 size += varint::length(*item_len as u64);
68 }
69 }
70 size += varint::length(self.relation_interval_offsets.len() as u64);
71 for (id_range,(byte_offset,byte_len,item_len)) in self.relation_interval_offsets.iter() {
72 if let (Included(low),Included(high)) = id_range {
73 size += varint::length(*low as u64);
74 size += varint::length(*high as u64);
75 size += varint::length(*byte_offset);
76 size += varint::length(*byte_len as u64);
77 size += varint::length(*item_len as u64);
78 }
79 }
80 size
81 }
82 fn count_from_bytes(_buf: &[u8]) -> Result<usize,Error> {
83 unimplemented![]
84 }
85}
86
87impl FromBytes for ScanTable {
88 fn from_bytes(buf: &[u8]) -> Result<(usize,Self),Error> {
89 let mut table = ScanTable::default();
90 let mut offset = 0;
91 let (s,node_len) = varint::decode(&buf[offset..])?;
92 offset += s;
93 for _ in 0..node_len {
94 let (s,low) = varint::decode(&buf[offset..])?;
95 offset += s;
96 let (s,high) = varint::decode(&buf[offset..])?;
97 offset += s;
98 let (s,byte_offset) = varint::decode(&buf[offset..])?;
99 offset += s;
100 let (s,byte_len) = varint::decode(&buf[offset..])?;
101 offset += s;
102 let (s,item_len) = varint::decode(&buf[offset..])?;
103 offset += s;
104 let id_range = (Included(low as i64),Included(high as i64));
105 table.node_interval_offsets.insert(
106 id_range.clone(),
107 (byte_offset, byte_len as usize, item_len as usize)
108 );
109 table.nodes.insert(id_range);
110 }
111 let (s,way_len) = varint::decode(&buf[offset..])?;
112 offset += s;
113 for _ in 0..way_len {
114 let (s,low) = varint::decode(&buf[offset..])?;
115 offset += s;
116 let (s,high) = varint::decode(&buf[offset..])?;
117 offset += s;
118 let (s,byte_offset) = varint::decode(&buf[offset..])?;
119 offset += s;
120 let (s,byte_len) = varint::decode(&buf[offset..])?;
121 offset += s;
122 let (s,item_len) = varint::decode(&buf[offset..])?;
123 offset += s;
124 let id_range = (Included(low as i64),Included(high as i64));
125 table.way_interval_offsets.insert(
126 id_range.clone(),
127 (byte_offset, byte_len as usize, item_len as usize)
128 );
129 table.ways.insert(id_range);
130 }
131 let (s,relation_len) = varint::decode(&buf[offset..])?;
132 offset += s;
133 for _ in 0..relation_len {
134 let (s,low) = varint::decode(&buf[offset..])?;
135 offset += s;
136 let (s,high) = varint::decode(&buf[offset..])?;
137 offset += s;
138 let (s,byte_offset) = varint::decode(&buf[offset..])?;
139 offset += s;
140 let (s,byte_len) = varint::decode(&buf[offset..])?;
141 offset += s;
142 let (s,item_len) = varint::decode(&buf[offset..])?;
143 offset += s;
144 let id_range = (Included(low as i64),Included(high as i64));
145 table.relation_interval_offsets.insert(
146 id_range.clone(),
147 (byte_offset, byte_len as usize, item_len as usize)
148 );
149 table.relations.insert(id_range);
150 }
151 Ok((offset,table))
152 }
153}