skyscraper8/GUIs/skyscraper8.UI.ImGui/Net/IpTrafficInfoComparer.cs
feyris-tan ef86554f9a Import
2025-05-12 22:09:16 +02:00

76 lines
2.0 KiB
C#

using skyscraper5.Skyscraper.Net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SDL2Demo.Net
{
public sealed class IpTrafficInfoComparer : IComparer<KeyValuePair<IpTrafficInfo, IpPerformanceInfo>>
{
public IpTrafficInfoComparer(IpTrafficInfoComparerMode mode = IpTrafficInfoComparerMode.ByNumPackets)
{
ComparisionMode = mode;
}
public IpTrafficInfoComparerMode ComparisionMode { get; set; }
public int Compare(KeyValuePair<IpTrafficInfo, IpPerformanceInfo> x, KeyValuePair<IpTrafficInfo, IpPerformanceInfo> y)
{
switch(ComparisionMode)
{
case IpTrafficInfoComparerMode.None:
return 0;
case IpTrafficInfoComparerMode.BySourceAddress:
return CompareSourceAddress(x.Key, y.Key);
case IpTrafficInfoComparerMode.ByNumPackets:
return CompareByNumPackets(x.Value, y.Value);
case IpTrafficInfoComparerMode.ByThroughput:
return x.Value.BytesPerSecond.CompareTo(y.Value.BytesPerSecond) / -1;
default:
throw new NotImplementedException(ComparisionMode.ToString());
}
}
private int CompareByNumPackets(IpPerformanceInfo x, IpPerformanceInfo y)
{
int realValue = x.TotalPackets.CompareTo(y.TotalPackets) / -1;
if (realValue != 0)
return realValue;
return x.TotalBytes.CompareTo(y.TotalBytes);
}
private int CompareSourceAddress(IpTrafficInfo x, IpTrafficInfo y)
{
int cmp = 0;
byte[] l = x.Source.GetAddressBytes();
byte[] r = y.Source.GetAddressBytes();
for (int i = 0; i < l.Length; i++)
{
cmp = l[i].CompareTo(r[i]);
if (cmp != 0)
return cmp;
}
l = x.Target.GetAddressBytes();
r = y.Target.GetAddressBytes();
for (int i = 0; i < l.Length; i++)
{
cmp = l[i].CompareTo(r[i]);
if (cmp != 0)
return cmp;
}
return x.Protocol.CompareTo(y.Protocol);
}
}
public enum IpTrafficInfoComparerMode
{
None = 0,
BySourceAddress = 1,
ByNumPackets = 2,
ByThroughput = 3
}
}