File tree Expand file tree Collapse file tree 3 files changed +57
-20
lines changed Expand file tree Collapse file tree 3 files changed +57
-20
lines changed Original file line number Diff line number Diff line change @@ -180,27 +180,12 @@ impl Address {
180
180
/// If `self` is a CIDR-compatible subnet mask, return `Some(prefix_len)`,
181
181
/// where `prefix_len` is the number of leading zeroes. Return `None` otherwise.
182
182
pub fn prefix_len ( & self ) -> Option < u8 > {
183
- let mut ones = true ;
184
- let mut prefix_len = 0 ;
185
- for byte in self . as_bytes ( ) {
186
- let mut mask = 0x80 ;
187
- for _ in 0 ..8 {
188
- let one = * byte & mask != 0 ;
189
- if ones {
190
- // Expect 1s until first 0
191
- if one {
192
- prefix_len += 1 ;
193
- } else {
194
- ones = false ;
195
- }
196
- } else if one {
197
- // 1 where 0 was expected
198
- return None ;
199
- }
200
- mask >>= 1 ;
201
- }
183
+ match self {
184
+ #[ cfg( feature = "proto-ipv4" ) ]
185
+ Address :: Ipv4 ( addr) => addr. prefix_len ( ) ,
186
+ #[ cfg( feature = "proto-ipv6" ) ]
187
+ Address :: Ipv6 ( addr) => addr. prefix_len ( ) ,
202
188
}
203
- Some ( prefix_len)
204
189
}
205
190
}
206
191
Original file line number Diff line number Diff line change @@ -108,6 +108,32 @@ impl Address {
108
108
pub const fn into_address ( self ) -> super :: IpAddress {
109
109
super :: IpAddress :: Ipv4 ( self )
110
110
}
111
+
112
+ /// If `self` is a CIDR-compatible subnet mask, return `Some(prefix_len)`,
113
+ /// where `prefix_len` is the number of leading zeroes. Return `None` otherwise.
114
+ pub fn prefix_len ( & self ) -> Option < u8 > {
115
+ let mut ones = true ;
116
+ let mut prefix_len = 0 ;
117
+ for byte in self . as_bytes ( ) {
118
+ let mut mask = 0x80 ;
119
+ for _ in 0 ..8 {
120
+ let one = * byte & mask != 0 ;
121
+ if ones {
122
+ // Expect 1s until first 0
123
+ if one {
124
+ prefix_len += 1 ;
125
+ } else {
126
+ ones = false ;
127
+ }
128
+ } else if one {
129
+ // 1 where 0 was expected
130
+ return None ;
131
+ }
132
+ mask >>= 1 ;
133
+ }
134
+ }
135
+ Some ( prefix_len)
136
+ }
111
137
}
112
138
113
139
impl From < :: core:: net:: Ipv4Addr > for Address {
Original file line number Diff line number Diff line change @@ -310,6 +310,32 @@ impl Address {
310
310
pub const fn into_address ( self ) -> super :: IpAddress {
311
311
super :: IpAddress :: Ipv6 ( self )
312
312
}
313
+
314
+ /// If `self` is a CIDR-compatible subnet mask, return `Some(prefix_len)`,
315
+ /// where `prefix_len` is the number of leading zeroes. Return `None` otherwise.
316
+ pub fn prefix_len ( & self ) -> Option < u8 > {
317
+ let mut ones = true ;
318
+ let mut prefix_len = 0 ;
319
+ for byte in self . as_bytes ( ) {
320
+ let mut mask = 0x80 ;
321
+ for _ in 0 ..8 {
322
+ let one = * byte & mask != 0 ;
323
+ if ones {
324
+ // Expect 1s until first 0
325
+ if one {
326
+ prefix_len += 1 ;
327
+ } else {
328
+ ones = false ;
329
+ }
330
+ } else if one {
331
+ // 1 where 0 was expected
332
+ return None ;
333
+ }
334
+ mask >>= 1 ;
335
+ }
336
+ }
337
+ Some ( prefix_len)
338
+ }
313
339
}
314
340
315
341
impl From < :: core:: net:: Ipv6Addr > for Address {
You can’t perform that action at this time.
0 commit comments