2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-06-27 13:33:13 +00:00
This commit is contained in:
2022-10-16 22:16:00 +03:00
parent 8e17a5b677
commit 6537913b11
14 changed files with 516 additions and 1 deletions

View File

@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
namespace Esiur.Analysis.Units
{
public enum BitRateKind
{
Bits,
Octets,
Bytes
}
public struct BitRate : IComparable
{
public double Value;
public BitRate(double value, BitRateKind kind = BitRateKind.Bits)
{
if (kind == BitRateKind.Bytes)
Value = value * 8;
else if (kind == BitRateKind.Octets)
Value = value * 7;
else
Value = value;
}
public static implicit operator BitRate(double d) => new BitRate(d);
public static implicit operator double(BitRate d) => d.Value;
//public static explicit operator PowerUnit(double d) => new PowerUnit(d, PowerUnitKind.Watt);
//public static explicit operator double(PowerUnit d) => d.Value;
//public static PowerUnit operator +(PowerUnit a) => a;
//public static PowerUnit operator -(PowerUnit a) => new PowerUnit(-a.num, a.den);
public static BitRate operator +(BitRate a, BitRate b)
=> new BitRate(a.Value + b.Value);
public static BitRate operator -(BitRate a, BitRate b)
=> new BitRate(a.Value - b.Value);
public static BitRate operator *(BitRate a, BitRate b)
=> new BitRate(a.Value * b.Value);
public static BitRate operator /(BitRate a, BitRate b)
{
if (b.Value == 0)
{
throw new DivideByZeroException();
}
return new BitRate(a.Value / b.Value);
}
public override string ToString()
{
if (Value >= 1e12)
return (Value / 1e12).ToString("F") + " tbps";
else if (Value >= 1e9)
return (Value / 1e9).ToString("F") + " gbps";
else if (Value >= 1e6)
return (Value / 1e6).ToString("F") + " mbps";
else if (Value >= 1e3)
return (Value * 1e3).ToString("F") + " kbps";
else
return Value.ToString("F") + " bps";
}
public int CompareTo(object obj)
{
if (obj is BitRate p)
return Value.CompareTo(p.Value);
else
return Value.CompareTo(obj);
}
}
}

View File

@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
namespace Esiur.Analysis.Units
{
public enum PowerUnitKind
{
Watt,
Decibel
}
public struct PowerUnit : IComparable
{
public double Value;
public PowerUnit(double value, PowerUnitKind kind = PowerUnitKind.Watt)
{
if (kind == PowerUnitKind.Watt)
Value = value;
else if (kind == PowerUnitKind.Decibel)
Value = FromDb(value);
else
Value = 0;
}
public static implicit operator PowerUnit(double d) => new PowerUnit(d, PowerUnitKind.Watt);
public static implicit operator double(PowerUnit d) => d.Value;
//public static explicit operator PowerUnit(double d) => new PowerUnit(d, PowerUnitKind.Watt);
//public static explicit operator double(PowerUnit d) => d.Value;
//public static PowerUnit operator +(PowerUnit a) => a;
//public static PowerUnit operator -(PowerUnit a) => new PowerUnit(-a.num, a.den);
public static PowerUnit operator +(PowerUnit a, PowerUnit b)
=> new PowerUnit(a.Value + b.Value);
public static PowerUnit operator -(PowerUnit a, PowerUnit b)
=> new PowerUnit(a.Value - b.Value);
public static PowerUnit operator *(PowerUnit a, PowerUnit b)
=> new PowerUnit(a.Value * b.Value);
public static PowerUnit operator /(PowerUnit a, PowerUnit b)
{
if (b.Value == 0)
{
throw new DivideByZeroException();
}
return new PowerUnit(a.Value / b.Value);
}
public override string ToString()
{
if (Value < 1e-6)
return (Value * 1e9).ToString("F") + "nW";
else if (Value < 1e-3)
return (Value * 1e6).ToString("F") + "µW";
else if (Value < 1)
return (Value * 1e3).ToString("F") + "mW";
else
return Value.ToString("F") + "W";
}
public double ToDb() => 10 * Math.Log(10, Value);
public static double FromDb(double value) => Math.Pow(10, value / 10);
public int CompareTo(object obj)
{
if (obj is PowerUnit p)
return Value.CompareTo(p.Value);
else
return Value.CompareTo(obj);
}
}
}