osmpbf_parser/
scan_bytes.rs

1use 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}