| 1 | module main |
| 2 | |
| 3 | import encoding.binary |
| 4 | |
| 5 | type Addr = [4]u8 |
| 6 | |
| 7 | fn Addr.from_u32(a u32) Addr { |
| 8 | mut bytes := [4]u8{} |
| 9 | binary.big_endian_put_u32_fixed(mut bytes, a) |
| 10 | return Addr(bytes) |
| 11 | } |
| 12 | |
| 13 | fn (a Addr) str() string { |
| 14 | return '${a[0]}.${a[1]}.${a[2]}.${a[3]}' |
| 15 | } |
| 16 | |
| 17 | fn (a Addr) u32() u32 { |
| 18 | return binary.big_endian_u32_fixed(a) |
| 19 | } |
| 20 | |
| 21 | struct Net { |
| 22 | netaddr Addr |
| 23 | broadcast Addr |
| 24 | mut: |
| 25 | h u32 |
| 26 | } |
| 27 | |
| 28 | fn (mut n Net) next() ?Addr { |
| 29 | if n.h >= n.broadcast.u32() + 1 { |
| 30 | return none |
| 31 | } |
| 32 | defer { |
| 33 | n.h++ |
| 34 | } |
| 35 | return Addr.from_u32(n.h) |
| 36 | } |
| 37 | |
| 38 | fn test_main() { |
| 39 | net := Net{ |
| 40 | netaddr: Addr([u8(172), 16, 16, 0]!) |
| 41 | broadcast: Addr([u8(172), 16, 16, 3]!) |
| 42 | h: u32(2886733824) |
| 43 | } |
| 44 | mut rets := []string{} |
| 45 | for addr in net { |
| 46 | rets << addr.str() |
| 47 | } |
| 48 | assert rets[0] == '172.16.16.0' |
| 49 | assert rets[1] == '172.16.16.1' |
| 50 | assert rets[2] == '172.16.16.2' |
| 51 | assert rets[3] == '172.16.16.3' |
| 52 | } |
| 53 | |