From 910a52b64be62c1fac90a382674ab4af19d3fbe3 Mon Sep 17 00:00:00 2001 From: Abhishek Chanda Date: Tue, 11 Jul 2017 21:21:00 +0100 Subject: [PATCH] Add a size method for Ipv6Network --- src/ipv6.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/ipv6.rs b/src/ipv6.rs index 807b300..f1a7d61 100644 --- a/src/ipv6.rs +++ b/src/ipv6.rs @@ -139,6 +139,27 @@ impl Ipv6Network { let addrs = Iterator::zip(a.iter(), b.iter()); self.mask().segments().iter().zip(addrs).all(|(mask, (a, b))| a & mask == b & mask) } + + + /// Returns number of possible host addresses in this `Ipv6Network`. + /// + /// # Examples + /// + /// ``` + /// use std::net::Ipv6Addr; + /// use ipnetwork::Ipv6Network; + /// + /// let net: Ipv6Network = "ff01::0/32".parse().unwrap(); + /// assert_eq!(net.size(), 79228162514264337593543950336); + /// + /// let tinynet: Ipv6Network = "ff01::0/128".parse().unwrap(); + /// assert_eq!(tinynet.size(), 1); + /// ``` + #[cfg(feature = "ipv6-methods")] + pub fn size(&self) -> u128 { + let host_bits = (IPV6_BITS - self.prefix) as u32; + (2 as u128).pow(host_bits) + } } impl FromStr for Ipv6Network { @@ -345,4 +366,11 @@ mod test { let expected: Ipv6Addr = "2001:db8::ffff:ffff".parse().unwrap(); assert_eq!(net, expected); } + + #[test] + #[cfg(feature = "ipv6-methods")] + fn size_v6() { + let cidr: Ipv6Network = "2001:db8::0/96".parse().unwrap(); + assert_eq!(cidr.size(), 4294967296); + } }