using System; using ln.types.btree; using ln.types.net; namespace skyspot.ip { public class IPPool where T : IComparable { public IPv4 FirstIP { get; set; } public IPv4 LastIP { get; set; } public IPv4 NextIP { get; set;} BTree forward = new BTree(); BTree reverse = new BTree(); public IPPool() { } public T FindForward(IPv4 ip) { lock (this) { return forward[ip]; } } public IPv4 FindReverse(T lookup) { lock (this) { return reverse[lookup]; } } public void Assign(IPv4 ip, T assigned) { lock (this) { if (forward.ContainsKey(ip) || reverse.ContainsKey(assigned)) throw new ArgumentException(" or already in pool"); forward.Add(ip, assigned); reverse.Add(assigned, ip); } } public void Remove(IPv4 ip) { lock (this) { if (forward.ContainsKey(ip)) { reverse.Remove(forward[ip]); forward.Remove(ip); } } } public void RemoveAssigned(T assigned) { lock (this) { if (reverse.ContainsKey(assigned)) { forward.Remove(reverse[assigned]); reverse.Remove(assigned); } } } public IPv4 Allocate(T assigned) { if (reverse.ContainsKey(assigned)) return reverse[assigned]; } } }