1- use std:: io:: { self , BufRead } ;
21use std:: fmt:: Display ;
32use std:: fmt:: Formatter ;
4- use std:: net :: Ipv4Addr ;
3+ use std:: io :: { self , BufRead } ;
54use std:: net:: AddrParseError ;
6- use std:: str :: FromStr ;
5+ use std:: net :: Ipv4Addr ;
76use std:: num:: ParseIntError ;
7+ use std:: str:: FromStr ;
88
99enum MyError {
1010 ParseIntError ( ParseIntError ) ,
@@ -14,8 +14,8 @@ enum MyError {
1414impl Display for MyError {
1515 fn fmt ( & self , _: & mut Formatter ) -> std:: fmt:: Result {
1616 match * self {
17- MyError :: ParseIntError ( ref e) => print ! ( "Parse int error {}" , e) ,
18- MyError :: ParseIpv4Error ( ref e) => print ! ( "Parse Ipv4 address error {}" , e )
17+ MyError :: ParseIntError ( ref e) => print ! ( "Parse int error {}" , e) ,
18+ MyError :: ParseIpv4Error ( ref e) => print ! ( "Parse Ipv4 address error {}" , e ) ,
1919 }
2020 Ok ( ( ) )
2121 }
@@ -33,7 +33,6 @@ impl std::convert::From<AddrParseError> for MyError {
3333 }
3434}
3535
36-
3736#[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
3837struct Ipv4Cidr {
3938 address : Ipv4Addr ,
@@ -46,7 +45,7 @@ impl Ipv4Cidr {
4645 return Self {
4746 address : cidr. network_addr ( ) ,
4847 mask : cidr. network_mask ( ) ,
49- }
48+ } ;
5049 }
5150 fn to_string ( & self ) -> String {
5251 format ! ( "{}/{}" , self . address, self . mask)
@@ -64,10 +63,7 @@ impl Ipv4Cidr {
6463 self . mask
6564 }
6665 fn generate_wrap_cidr ( & self ) -> Ipv4Cidr {
67- Ipv4Cidr :: new (
68- self . address ,
69- self . mask - 1
70- )
66+ Ipv4Cidr :: new ( self . address , self . mask - 1 )
7167 }
7268}
7369
@@ -77,19 +73,22 @@ impl FromStr for Ipv4Cidr {
7773 let v: Vec < & str > = cidr. split ( '/' ) . collect ( ) ;
7874 Ok ( Ipv4Cidr :: new (
7975 Ipv4Addr :: from_str ( v[ 0 ] ) . unwrap ( ) ,
80- v[ 1 ] . parse :: < u8 > ( ) ?
76+ v[ 1 ] . parse :: < u8 > ( ) ?,
8177 ) )
8278 }
8379}
8480
85-
8681// Merge two CIDR blocks
8782fn merge ( cidr1 : Ipv4Cidr , cidr2 : Ipv4Cidr ) -> Option < Ipv4Cidr > {
8883 // Check wether cidr1 includes cidr2 vice versa
89- if cidr1. network_addr ( ) <= cidr2. network_addr ( ) && cidr2. broadcast_addr ( ) <= cidr1. broadcast_addr ( ) {
84+ if cidr1. network_addr ( ) <= cidr2. network_addr ( )
85+ && cidr2. broadcast_addr ( ) <= cidr1. broadcast_addr ( )
86+ {
9087 return Some ( cidr1) ;
9188 }
92- if cidr2. network_addr ( ) <= cidr1. network_addr ( ) && cidr1. broadcast_addr ( ) <= cidr2. broadcast_addr ( ) {
89+ if cidr2. network_addr ( ) <= cidr1. network_addr ( )
90+ && cidr1. broadcast_addr ( ) <= cidr2. broadcast_addr ( )
91+ {
9392 return Some ( cidr2) ;
9493 }
9594
@@ -108,7 +107,6 @@ fn is_adjascent(cidr1: Ipv4Cidr, cidr2: Ipv4Cidr) -> bool {
108107 return u32:: from ( cidr1. broadcast_addr ( ) ) + 1 == u32:: from ( cidr2. network_addr ( ) ) ;
109108}
110109
111-
112110fn main ( ) {
113111 let stdin = io:: stdin ( ) ;
114112 let mut cidrs = Vec :: new ( ) ;
@@ -139,18 +137,18 @@ fn main() {
139137 match merged {
140138 Some ( merged) => {
141139 stack. push ( merged) ;
142- } ,
140+ }
143141 None => {
144142 stack. push ( cidr1) ;
145- if ! is_adjascent ( cidr1, cidr2) {
143+ if !is_adjascent ( cidr1, cidr2) {
146144 for x in stack {
147145 println ! ( "{}" , x. to_string( ) ) ;
148146 }
149147 stack = Vec :: new ( ) ;
150148 }
151149 stack. push ( cidr2) ;
152150 break ;
153- } ,
151+ }
154152 }
155153 }
156154 }
0 commit comments