Skip to content

Commit 7b5a266

Browse files
committed
Feat: operators + and -
1 parent 1dc5bb9 commit 7b5a266

File tree

3 files changed

+158
-33
lines changed

3 files changed

+158
-33
lines changed

README.md

Lines changed: 76 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,35 @@ PM> nuget install IPNetwork2
3737

3838
---
3939

40-
### Example 1 (IPv6)
40+
### Example 1 (IPv4)
41+
42+
```C#
43+
IPNetwork2 ipnetwork = IPNetwork2.Parse("192.168.168.100/24");
44+
45+
Console.WriteLine("Network : {0}", ipnetwork.Network);
46+
Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
47+
Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
48+
Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
49+
Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
50+
Console.WriteLine("Usable : {0}", ipnetwork.Usable);
51+
Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);
52+
```
53+
54+
Output
55+
56+
```MD
57+
Network : 192.168.168.0
58+
Netmask : 255.255.255.0
59+
Broadcast : 192.168.168.255
60+
FirstUsable : 192.168.168.1
61+
LastUsable : 192.168.168.254
62+
Usable : 254
63+
Cidr : 24
64+
```
65+
66+
---
67+
68+
### Example 2 (IPv6)
4169

4270
```C#
4371
IPNetwork2 ipnetwork = IPNetwork2.Parse("2001:0db8::/64");
@@ -65,7 +93,7 @@ Cidr : 64
6593

6694
---
6795

68-
### Example 2 (IPv6)
96+
### Example 3 (IPv6)
6997

7098
```C#
7199
IPNetwork2 ipnetwork = IPNetwork2.Parse("2001:0db8::/64");
@@ -107,7 +135,7 @@ Output
107135

108136
---
109137

110-
### Example 3 (IPv6)
138+
### Example 4 (IPv6)
111139

112140
```C#
113141
IPNetwork2 wholeInternet = IPNetwork2.Parse("::/0");
@@ -139,7 +167,7 @@ c000::/2
139167

140168
---
141169

142-
### Example 4 (IPv6)
170+
### Example 5 (IPv6)
143171

144172
```C#
145173
IPNetwork2 ipnetwork1 = IPNetwork2.Parse("2001:0db8::/32");
@@ -157,34 +185,6 @@ Output
157185

158186
---
159187

160-
### Example 5
161-
162-
```C#
163-
IPNetwork2 ipnetwork = IPNetwork2.Parse("192.168.168.100/24");
164-
165-
Console.WriteLine("Network : {0}", ipnetwork.Network);
166-
Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
167-
Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
168-
Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
169-
Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
170-
Console.WriteLine("Usable : {0}", ipnetwork.Usable);
171-
Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);
172-
```
173-
174-
Output
175-
176-
```MD
177-
Network : 192.168.168.0
178-
Netmask : 255.255.255.0
179-
Broadcast : 192.168.168.255
180-
FirstUsable : 192.168.168.1
181-
LastUsable : 192.168.168.254
182-
Usable : 254
183-
Cidr : 24
184-
```
185-
186-
---
187-
188188
### Example 6
189189

190190
```C#
@@ -280,7 +280,7 @@ All :
280280

281281
---
282282

283-
### Example 9
283+
### Example 9 Supernet
284284

285285
```C#
286286
IPNetwork2 ipnetwork1 = IPNetwork2.Parse("192.168.0.0/24");
@@ -298,6 +298,24 @@ Output
298298

299299
---
300300

301+
### Example 9 Operator +
302+
303+
```C#
304+
IPNetwork2 ipnetwork1 = IPNetwork2.Parse("192.168.0.0/24");
305+
IPNetwork2 ipnetwork2 = IPNetwork2.Parse("192.168.1.0/24");
306+
IPNetwork2[] ipnetwork3 = ipnetwork1 + ipnetwork2;
307+
308+
Console.WriteLine("{0} + {1} = {2}", ipnetwork1, ipnetwork2, ipnetwork3[0]);
309+
```
310+
311+
Output
312+
313+
```JS
314+
192.168.0.0/24 + 192.168.1.0/24 = 192.168.0.0/23
315+
```
316+
317+
---
318+
301319
### Example 10 - ClassLess network parse
302320

303321
If you don't specify the network cidr, IPNetwork will try to guess the CIDR for you. There are two strategies to guess ClassFull (default) and ClassLess.
@@ -438,6 +456,31 @@ Resut:
438456

439457
---
440458

459+
#### operator -
460+
461+
```C#
462+
// Prepare
463+
var network1 = IPNetwork2.Parse("0.0.0.0", 0);
464+
var network2 = IPNetwork2.Parse("10.0.0.1", 32);
465+
466+
// Act
467+
var result = network1 - network2;
468+
469+
// Assert
470+
string ips = string.Join(", ", result);
471+
Console.WriteLine("{0}", ips);
472+
```
473+
Resut:
474+
```JS
475+
0.0.0.0/5, 8.0.0.0/7, 10.0.0.0/32, 10.0.0.2/31, 10.0.0.4/30, 10.0.0.8/29,
476+
10.0.0.16/28, 10.0.0.32/27, 10.0.0.64/26, 10.0.0.128/25, 10.0.1.0/24,
477+
10.0.2.0/23, 10.0.4.0/22, 10.0.8.0/21, 10.0.16.0/20, 10.0.32.0/19, 10.0.64.0/18,
478+
10.0.128.0/17, 10.1.0.0/16, 10.2.0.0/15, 10.4.0.0/14, 10.8.0.0/13, 10.16.0.0/12,
479+
10.32.0.0/11, 10.64.0.0/10, 10.128.0.0/9, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4,
480+
32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/1
481+
```
482+
---
483+
441484
## IPNetwork utility command line
442485

443486
IPNetwork utility command line take care of complex network, ip, netmask,

src/System.Net.IPNetwork/IPNetwork2Operators.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Copyright (c) IPNetwork. All rights reserved.
33
// </copyright>
44

5+
using System.Collections.Generic;
6+
57
namespace System.Net;
68

79
/// <summary>
@@ -52,4 +54,30 @@ public sealed partial class IPNetwork2
5254
{
5355
return Compare(left, right) > 0;
5456
}
57+
58+
/// <summary>
59+
/// Subtract two IPNetwork.
60+
/// </summary>
61+
/// <param name="left">left instance.</param>
62+
/// <param name="right">Right instance.</param>
63+
/// <returns>The symmetric difference (subtraction) of two networks.</returns>
64+
public static List<IPNetwork2> operator -(IPNetwork2 left, IPNetwork2 right)
65+
{
66+
return left.Subtract(right);
67+
}
68+
69+
/// <summary>
70+
/// Add two IPNetwork.
71+
/// </summary>
72+
/// <param name="left">left instance.</param>
73+
/// <param name="right">Right instance.</param>
74+
/// <returns>Try to supernet two consecutive cidr equal subnet into a single one, otherwise return both netowkrs.</returns>
75+
public static List<IPNetwork2> operator +(IPNetwork2 left, IPNetwork2 right)
76+
{
77+
if (left.TrySupernet(right, out var result))
78+
{
79+
return [result];
80+
};
81+
return [left, right];
82+
}
5583
}

src/TestProject/IPNetworkTest/IPNetworkOperatorTests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,58 @@ public void TestOperatorEqual2()
121121

122122
Assert.IsTrue(eq, "eq");
123123
}
124+
125+
/// <summary>
126+
/// Tests Operator functionality with Operator -.
127+
/// </summary>
128+
[TestMethod]
129+
[DataRow("10.0.0.1/32", "10.0.0.1/32", 0)]
130+
[DataRow("10.0.0.1/24", "10.0.0.1/25", 1)]
131+
[DataRow("10.0.0.1/24", "10.0.0.1/26", 2)]
132+
[DataRow("10.0.0.1/24", "10.0.0.1/27", 3)]
133+
[DataRow("10.0.0.1/24", "10.0.0.1/28", 4)]
134+
[DataRow("10.0.0.1/24", "10.0.0.1/29", 5)]
135+
[DataRow("10.0.0.1/24", "10.0.0.1/30", 6)]
136+
[DataRow("10.0.0.1/24", "10.0.0.1/31", 7)]
137+
[DataRow("10.0.0.1/24", "10.0.0.1/32", 8)]
138+
[DataRow("0.0.0.0/0", "0.0.0.0/32", 32)]
139+
public void TestOperatorSubtract(string left, string right, int count)
140+
{
141+
var ipn1 = IPNetwork2.Parse(left);
142+
var ipn2 = IPNetwork2.Parse(right);
143+
144+
var result = ipn1 - ipn2;
145+
146+
Assert.HasCount(count, result, "subtract");
147+
}
148+
149+
150+
/// <summary>
151+
/// Tests Operator functionality with Operator -.
152+
/// </summary>
153+
[TestMethod]
154+
[DataRow("10.0.0.0/32", "10.0.0.1/32", 1)]
155+
[DataRow("10.0.0.0/32", "10.0.0.2/32", 2)]
156+
[DataRow("10.0.0.0/32", "10.0.0.3/32", 2)]
157+
[DataRow("10.0.0.0/24", "10.0.1.3/32", 2)]
158+
[DataRow("10.0.0.0/24", "10.0.1.3/24", 1)]
159+
[DataRow("10.0.0.1/32", "10.0.0.1/32", 1)]
160+
[DataRow("10.0.0.1/24", "10.0.0.1/25", 1)]
161+
[DataRow("10.0.0.1/24", "10.0.0.1/26", 1)]
162+
[DataRow("10.0.0.1/24", "10.0.0.1/27", 1)]
163+
[DataRow("10.0.0.1/24", "10.0.0.1/28", 1)]
164+
[DataRow("10.0.0.1/24", "10.0.0.1/29", 1)]
165+
[DataRow("10.0.0.1/24", "10.0.0.1/30", 1)]
166+
[DataRow("10.0.0.1/24", "10.0.0.1/31", 1)]
167+
[DataRow("10.0.0.1/24", "10.0.0.1/32", 1)]
168+
[DataRow("0.0.0.0/0", "0.0.0.0/32", 1)]
169+
public void TestOperatorAdd(string left, string right, int count)
170+
{
171+
var ipn1 = IPNetwork2.Parse(left);
172+
var ipn2 = IPNetwork2.Parse(right);
173+
174+
var result = ipn1 + ipn2;
175+
176+
Assert.HasCount(count, result, "add");
177+
}
124178
}

0 commit comments

Comments
 (0)