jellyfin/Emby.Server.Implementations/Networking/IPNetwork/IPAddressCollection.cs

95 lines
2.0 KiB
C#
Raw Normal View History

using System;
using System.Collections;
2018-09-12 17:26:21 +00:00
using System.Collections.Generic;
using System.Net;
2018-09-12 17:26:21 +00:00
using System.Numerics;
namespace Emby.Server.Implementations.Networking.IPNetwork
2018-09-12 17:26:21 +00:00
{
public class IPAddressCollection : IEnumerable<IPAddress>, IEnumerator<IPAddress>
{
private IPNetwork _ipnetwork;
private BigInteger _enumerator;
internal IPAddressCollection(IPNetwork ipnetwork)
{
this._ipnetwork = ipnetwork;
this._enumerator = -1;
}
#region Count, Array, Enumerator
public BigInteger Count => this._ipnetwork.Total;
2018-09-12 17:26:21 +00:00
public IPAddress this[BigInteger i]
{
get
{
if (i >= this.Count)
{
throw new ArgumentOutOfRangeException(nameof(i));
2018-09-12 17:26:21 +00:00
}
byte width = this._ipnetwork.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork ? (byte)32 : (byte)128;
2019-01-13 20:37:13 +00:00
var ipn = this._ipnetwork.Subnet(width);
2018-09-12 17:26:21 +00:00
return ipn[i].Network;
}
}
#endregion
#region IEnumerable Members
IEnumerator<IPAddress> IEnumerable<IPAddress>.GetEnumerator()
{
return this;
}
IEnumerator IEnumerable.GetEnumerator()
{
return this;
}
#region IEnumerator<IPNetwork> Members
public IPAddress Current => this[this._enumerator];
2018-09-12 17:26:21 +00:00
#endregion
#region IDisposable Members
public void Dispose()
{
// nothing to dispose
return;
}
#endregion
#region IEnumerator Members
object IEnumerator.Current => this.Current;
2018-09-12 17:26:21 +00:00
public bool MoveNext()
{
this._enumerator++;
if (this._enumerator >= this.Count)
{
return false;
}
return true;
}
public void Reset()
{
this._enumerator = -1;
}
#endregion
#endregion
}
}