|
1 | 1 | #![deny(trivial_casts, trivial_numeric_casts, unused_import_braces)] |
2 | 2 |
|
| 3 | +use std::cmp::Ordering; |
3 | 4 | use std::collections::BTreeMap; |
4 | 5 | use std::fmt::{self, Display, Formatter}; |
5 | 6 | use std::io; |
@@ -114,53 +115,59 @@ impl<'de, T: Deserialize<'de>, S: AsRef<[u8]>> Iterator for Within<'de, T, S> { |
114 | 115 | continue; |
115 | 116 | } |
116 | 117 |
|
117 | | - if current.node > self.node_count { |
118 | | - // This is a data node, emit it and we're done (until the following next call) |
119 | | - let ip_net = |
120 | | - match bytes_and_prefix_to_net(¤t.ip_bytes, current.prefix_len as u8) { |
| 118 | + match current.node.cmp(&self.node_count) { |
| 119 | + Ordering::Greater => { |
| 120 | + // This is a data node, emit it and we're done (until the following next call) |
| 121 | + let ip_net = match bytes_and_prefix_to_net( |
| 122 | + ¤t.ip_bytes, |
| 123 | + current.prefix_len as u8, |
| 124 | + ) { |
121 | 125 | Ok(ip_net) => ip_net, |
122 | 126 | Err(e) => return Some(Err(e)), |
123 | 127 | }; |
124 | | - // TODO: should this block become a helper method on reader? |
125 | | - let rec = match self.reader.resolve_data_pointer(current.node) { |
126 | | - Ok(rec) => rec, |
127 | | - Err(e) => return Some(Err(e)), |
128 | | - }; |
129 | | - let mut decoder = decoder::Decoder::new( |
130 | | - &self.reader.buf.as_ref()[self.reader.pointer_base..], |
131 | | - rec, |
132 | | - ); |
133 | | - return match T::deserialize(&mut decoder) { |
134 | | - Ok(info) => Some(Ok(WithinItem { ip_net, info })), |
135 | | - Err(e) => Some(Err(e)), |
136 | | - }; |
137 | | - } else if current.node == self.node_count { |
138 | | - // Dead end, nothing to do |
139 | | - } else { |
140 | | - // In order traversal of our children |
141 | | - // right/1-bit |
142 | | - let mut right_ip_bytes = current.ip_bytes.clone(); |
143 | | - right_ip_bytes[current.prefix_len >> 3] |= |
144 | | - 1 << ((bit_count - current.prefix_len - 1) % 8); |
145 | | - let node = match self.reader.read_node(current.node, 1) { |
146 | | - Ok(node) => node, |
147 | | - Err(e) => return Some(Err(e)), |
148 | | - }; |
149 | | - self.stack.push(WithinNode { |
150 | | - node, |
151 | | - ip_bytes: right_ip_bytes, |
152 | | - prefix_len: current.prefix_len + 1, |
153 | | - }); |
154 | | - // left/0-bit |
155 | | - let node = match self.reader.read_node(current.node, 0) { |
156 | | - Ok(node) => node, |
157 | | - Err(e) => return Some(Err(e)), |
158 | | - }; |
159 | | - self.stack.push(WithinNode { |
160 | | - node, |
161 | | - ip_bytes: current.ip_bytes.clone(), |
162 | | - prefix_len: current.prefix_len + 1, |
163 | | - }); |
| 128 | + // TODO: should this block become a helper method on reader? |
| 129 | + let rec = match self.reader.resolve_data_pointer(current.node) { |
| 130 | + Ok(rec) => rec, |
| 131 | + Err(e) => return Some(Err(e)), |
| 132 | + }; |
| 133 | + let mut decoder = decoder::Decoder::new( |
| 134 | + &self.reader.buf.as_ref()[self.reader.pointer_base..], |
| 135 | + rec, |
| 136 | + ); |
| 137 | + return match T::deserialize(&mut decoder) { |
| 138 | + Ok(info) => Some(Ok(WithinItem { ip_net, info })), |
| 139 | + Err(e) => Some(Err(e)), |
| 140 | + }; |
| 141 | + } |
| 142 | + Ordering::Equal => { |
| 143 | + // Dead end, nothing to do |
| 144 | + } |
| 145 | + Ordering::Less => { |
| 146 | + // In order traversal of our children |
| 147 | + // right/1-bit |
| 148 | + let mut right_ip_bytes = current.ip_bytes.clone(); |
| 149 | + right_ip_bytes[current.prefix_len >> 3] |= |
| 150 | + 1 << ((bit_count - current.prefix_len - 1) % 8); |
| 151 | + let node = match self.reader.read_node(current.node, 1) { |
| 152 | + Ok(node) => node, |
| 153 | + Err(e) => return Some(Err(e)), |
| 154 | + }; |
| 155 | + self.stack.push(WithinNode { |
| 156 | + node, |
| 157 | + ip_bytes: right_ip_bytes, |
| 158 | + prefix_len: current.prefix_len + 1, |
| 159 | + }); |
| 160 | + // left/0-bit |
| 161 | + let node = match self.reader.read_node(current.node, 0) { |
| 162 | + Ok(node) => node, |
| 163 | + Err(e) => return Some(Err(e)), |
| 164 | + }; |
| 165 | + self.stack.push(WithinNode { |
| 166 | + node, |
| 167 | + ip_bytes: current.ip_bytes.clone(), |
| 168 | + prefix_len: current.prefix_len + 1, |
| 169 | + }); |
| 170 | + } |
164 | 171 | } |
165 | 172 | } |
166 | 173 | None |
@@ -448,7 +455,7 @@ fn ip_to_bytes(address: IpAddr) -> Vec<u8> { |
448 | 455 | } |
449 | 456 | } |
450 | 457 |
|
451 | | -fn bytes_and_prefix_to_net(bytes: &Vec<u8>, prefix: u8) -> Result<IpNetwork, MaxMindDBError> { |
| 458 | +fn bytes_and_prefix_to_net(bytes: &[u8], prefix: u8) -> Result<IpNetwork, MaxMindDBError> { |
452 | 459 | let (ip, pre) = match bytes.len() { |
453 | 460 | 4 => ( |
454 | 461 | IpAddr::V4(Ipv4Addr::new(bytes[0], bytes[1], bytes[2], bytes[3])), |
|
0 commit comments