|
|
@@ -129,11 +129,7 @@ impl<R: Read + Seek + Send> IndexedReader<R> {
|
|
129
|
129
|
/// # }
|
|
130
|
130
|
/// # foo().unwrap();
|
|
131
|
131
|
/// ```
|
|
132
|
|
- pub fn read_ways_and_deps<F, E>(
|
|
133
|
|
- &mut self,
|
|
134
|
|
- mut filter: F,
|
|
135
|
|
- mut element_callback: E,
|
|
136
|
|
- ) -> Result<()>
|
|
|
132
|
+ pub fn read_ways_and_deps<F, E>(&mut self, mut filter: F, mut element_callback: E) -> Result<()>
|
|
137
|
133
|
where
|
|
138
|
134
|
F: for<'a> FnMut(&Way<'a>) -> bool,
|
|
139
|
135
|
E: for<'a> FnMut(&Element<'a>),
|
|
|
@@ -202,10 +198,13 @@ impl<R: Read + Seek + Send> IndexedReader<R> {
|
|
202
|
198
|
// * Iterate only over blobs that may include the node IDs we're searching for
|
|
203
|
199
|
for info in &mut self.index {
|
|
204
|
200
|
if info.blob_type == SimpleBlobType::Primitive {
|
|
205
|
|
- if let Some(node_id_range) = info.id_ranges.as_ref().and_then(|r| r.node_ids.as_ref()) {
|
|
|
201
|
+ if let Some(node_id_range) =
|
|
|
202
|
+ info.id_ranges.as_ref().and_then(|r| r.node_ids.as_ref())
|
|
|
203
|
+ {
|
|
206
|
204
|
if range_included(node_id_range.clone(), &node_ids) {
|
|
207
|
205
|
//TODO Only collect into Vec if range has a reasonable size
|
|
208
|
|
- let node_ids: Vec<i64> = node_ids.range(node_id_range.clone()).copied().collect();
|
|
|
206
|
+ let node_ids: Vec<i64> =
|
|
|
207
|
+ node_ids.range(node_id_range.clone()).copied().collect();
|
|
209
|
208
|
self.reader.seek(info.offset)?;
|
|
210
|
209
|
let blob = self.reader.next().ok_or_else(|| {
|
|
211
|
210
|
::std::io::Error::new(
|
|
|
@@ -265,7 +264,7 @@ mod tests {
|
|
265
|
264
|
#[test]
|
|
266
|
265
|
fn test_range_included_set() {
|
|
267
|
266
|
let mut set = BTreeSet::<i64>::new();
|
|
268
|
|
- set.extend(&[1,2,6]);
|
|
|
267
|
+ set.extend(&[1, 2, 6]);
|
|
269
|
268
|
|
|
270
|
269
|
assert_eq!(range_included(RangeInclusive::new(0, 0), &set), false);
|
|
271
|
270
|
assert_eq!(range_included(RangeInclusive::new(1, 1), &set), true);
|