ServerManagers/src/ServerManager.Common/Converters/ProcessorAffinityConverter.cs
2021-01-07 16:23:23 +10:00

49 lines
1.4 KiB
C#

using ServerManagerTool.Common.Utils;
using System;
using System.Globalization;
using System.Numerics;
using System.Windows.Data;
namespace ServerManagerTool.Common.Converters
{
public class ProcessorAffinityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!BigInteger.TryParse(value.ToString(), out BigInteger affinity))
return "Invalid";
if (!ProcessUtils.IsProcessorAffinityValid(affinity))
return "Invalid";
if (affinity == BigInteger.Zero)
return "All";
var result = string.Empty;
var delimiter = string.Empty;
var index = 0;
while (true)
{
var cpuValue = (BigInteger)Math.Pow(2, index);
if (cpuValue > affinity)
break;
if ((affinity & cpuValue) == cpuValue)
{
result = $"{result}{delimiter}{index}";
delimiter = ", ";
}
index++;
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new InvalidOperationException("ProcessorAffinityConverter can only be used OneWay.");
}
}
}