]> gitweb.michael.orlitzky.com - hath.git/commitdiff
Added the adjacent function to Cidr.
authorMichael Orlitzky <michael@orlitzky.com>
Sun, 9 May 2010 17:03:54 +0000 (13:03 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Sun, 9 May 2010 17:03:54 +0000 (13:03 -0400)
src/Cidr.hs

index df35138aa8fca2d6f43c7a952f146f1fc8e4da87..1b7d1dd0892c2536e09cf9fb5e97a132a02cfdb8 100644 (file)
@@ -114,3 +114,21 @@ redundant cidrlist cidr = any ((flip contains_proper) cidr) cidrlist
 combine_all :: [Cidr] -> [Cidr]
 combine_all cidrs =
     filter (not . (redundant cidrs)) cidrs
+
+
+-- Determine whether or not two CIDR ranges are adjacent. If two
+-- ranges lie consecutively within the IP space, they can be
+-- combined. For example, 10.1.0.0/24 and 10.0.1.0/24 are adjacent,
+-- and can be combined in to 10.1.0.0/23.
+adjacent :: Cidr -> Cidr -> Bool
+adjacent Cidr.None _ = False
+adjacent _ Cidr.None = False
+adjacent cidr1 cidr2
+  | mbits1 /= mbits2 = False
+  | mbits1 == Maskbits.Zero = False -- They're equal.
+  | otherwise = (mbits1 == (most_sig_bit_different addr1 addr2))
+  where
+    addr1 = ipv4address cidr1
+    addr2 = ipv4address cidr2
+    mbits1 = maskbits cidr1
+    mbits2 = maskbits cidr2