ip2location_bin_format/index/
mod.rs1use std::net::{Ipv4Addr, Ipv6Addr};
2
3pub const INDEX_LEN: u32 = 524288;
5pub const INDEX_ELEMENT_LEN: u32 = 4;
6
7pub mod builder;
9pub mod querier;
10
11pub use querier::{V4Querier, V6Querier};
12
13pub fn ipv4_addr_position(ip: Ipv4Addr) -> u32 {
15 (u32::from(ip) >> 16) << 3
17}
18
19pub fn ipv6_addr_position(ip: Ipv6Addr) -> u32 {
20 ((ip.octets()[0] as u32) * 256 + (ip.octets()[1] as u32)) << 3
22}
23
24#[cfg(test)]
25pub fn v4_index_len() -> u32 {
26 ipv4_addr_position(Ipv4Addr::new(255, 255, 255, 255)) + INDEX_ELEMENT_LEN + INDEX_ELEMENT_LEN
28}
29
30#[cfg(test)]
31pub fn v6_index_len() -> u32 {
32 ipv6_addr_position(Ipv6Addr::new(
34 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
35 )) + INDEX_ELEMENT_LEN
36 + INDEX_ELEMENT_LEN
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn test_index_len() {
45 assert_eq!(v4_index_len(), INDEX_LEN);
46 assert_eq!(v6_index_len(), INDEX_LEN);
47 }
48}