Files
csharp/src/KubernetesClient/ResourceQuantity.cs

418 lines
14 KiB
C#
Raw Normal View History

using System.Globalization;
using System.Numerics;
2020-03-10 15:19:37 -07:00
using Fractions;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;
namespace k8s.Models
{
/// <summary>
/// port https://github.com/kubernetes/apimachinery/blob/master/pkg/api/resource/quantity.go to c#
/// Quantity is a fixed-point representation of a number.
/// It provides convenient marshaling/unmarshaling in JSON and YAML,
/// in addition to String() and Int64() accessors.
/// The serialization format is:
/// quantity ::= signedNumber suffix
/// (Note that suffix may be empty, from the "" case in decimalSI.)
/// digit ::= 0 | 1 | ... | 9
/// digits ::= digit | digitdigits
/// number ::= digits | digits.digits | digits. | .digits
/// sign ::= "+" | "-"
/// signedNumber ::= number | signnumber
/// suffix ::= binarySI | decimalExponent | decimalSI
/// binarySI ::= Ki | Mi | Gi | Ti | Pi | Ei
/// (International System of units; See: http:///physics.nist.gov/cuu/Units/binary.html)
/// decimalSI ::= m | "" | k | M | G | T | P | E
/// (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.)
/// decimalExponent ::= "e" signedNumber | "E" signedNumber
/// No matter which of the three exponent forms is used, no quantity may represent
/// a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal
/// places. Numbers larger or more precise will be capped or rounded up.
/// (E.g.: 0.1m will rounded up to 1m.)
/// This may be extended in the future if we require larger or smaller quantities.
/// When a Quantity is parsed from a string, it will remember the type of suffix
/// it had, and will use the same type again when it is serialized.
/// Before serializing, Quantity will be put in "canonical form".
/// This means that Exponent/suffix will be adjusted up or down (with a
/// corresponding increase or decrease in Mantissa) such that:
/// a. No precision is lost
/// b. No fractional digits will be emitted
/// c. The exponent (or suffix) is as large as possible.
/// The sign will be omitted unless the number is negative.
/// Examples:
/// 1.5 will be serialized as "1500m"
/// 1.5Gi will be serialized as "1536Mi"
/// NOTE: We reserve the right to amend this canonical format, perhaps to
/// allow 1.5 to be canonical.
/// TODO: Remove above disclaimer after all bikeshedding about format is over,
/// or after March 2015.
/// Note that the quantity will NEVER be internally represented by a
/// floating point number. That is the whole point of this exercise.
/// Non-canonical values will still parse as long as they are well formed,
/// but will be re-emitted in their canonical form. (So always use canonical
/// form, or don't diff.)
/// This format is intended to make it difficult to use these numbers without
/// writing some sort of special handling code in the hopes that that will
/// cause implementors to also use a fixed point implementation.
/// </summary>
[JsonConverter(typeof(QuantityConverter))]
public partial class ResourceQuantity : IYamlConvertible
{
public enum SuffixFormat
{
/// <summary>
/// e.g., 12e6
/// </summary>
DecimalExponent,
/// <summary>
/// e.g., 12Mi (12 * 2^20)
/// </summary>
BinarySI,
/// <summary>
/// e.g., 12M (12 * 10^6)
/// </summary>
DecimalSI,
}
public static readonly decimal MaxAllowed = (decimal)BigInteger.Pow(2, 63) - 1;
private static readonly char[] SuffixChars = "eEinumkKMGTP".ToCharArray();
private Fraction _unitlessValue;
public ResourceQuantity(decimal n, int exp, SuffixFormat format)
{
_unitlessValue = Fraction.FromDecimal(n) * Fraction.Pow(10, exp);
Format = format;
}
public SuffixFormat Format { get; private set; }
public string CanonicalizeString()
{
return CanonicalizeString(Format);
}
public override string ToString()
{
return CanonicalizeString();
}
protected bool Equals(ResourceQuantity other)
{
return Format == other?.Format && _unitlessValue.Equals(other._unitlessValue);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
if (obj.GetType() != GetType())
{
return false;
}
2020-04-22 12:15:45 -07:00
return Equals((ResourceQuantity)obj);
}
public override int GetHashCode()
{
unchecked
{
2020-04-22 12:15:45 -07:00
return ((int)Format * 397) ^ _unitlessValue.GetHashCode();
}
}
//
// CanonicalizeString = go version CanonicalizeBytes
// CanonicalizeBytes returns the canonical form of q and its suffix (see comment on Quantity).
//
// Note about BinarySI:
// * If q.Format is set to BinarySI and q.Amount represents a non-zero value between
// -1 and +1, it will be emitted as if q.Format were DecimalSI.
// * Otherwise, if q.Format is set to BinarySI, fractional parts of q.Amount will be
// rounded up. (1.1i becomes 2i.)
public string CanonicalizeString(SuffixFormat suffixFormat)
{
if (suffixFormat == SuffixFormat.BinarySI)
{
Squashed commit of the following: (#492) commit dc93612024202e651a9cbe4194c1495c823bff12 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:24:33 2020 -0700 fix SA1505 commit dc9fdbc4a4fbce7f4362a24e1ff98be4d27e16a8 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:24:02 2020 -0700 add () commit 16fb7357fcd7e288a4b8fb201fda2b0aae92e5bc Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:21:37 2020 -0700 disable SA1117 commit 544a7e5891e853e2e222f855e5446f3fd79ce2ba Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:21:16 2020 -0700 fix SA1508 commit 4e998adf440dda4f13512d1e10f8cb5d5fbc6bd9 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:08:28 2020 -0700 allow sa1623 commit baf787255c657a00a6074598c6875e0ab4c9d065 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:07:23 2020 -0700 fix SA1413 commit 5ef2ca65de62e6c3cbe513902e3954d78f6dc315 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:05:45 2020 -0700 fix SA1413 commit 6cb71f08060b8252a18b01a5788eb2ddcee67c3e Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:44:55 2020 -0700 fix throw stack commit e6ada0b1cb3aa72df5fcaa0b4690aadcbd4bda5a Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:44:35 2020 -0700 allow CA2225 commit 2e79edec5843c20b7e8f8e9ec5b61cf95284466a Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:35:50 2020 -0700 allow SA1507 commit 108f5a6361f4faa211a8e01f783803295fac0453 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:35:31 2020 -0700 force SA1413 commit 20f33b64972bfafeada513ae1a46a030934673fd Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:30:58 2020 -0700 force SA1413 commit 6b0de102d68a116e149868731e155bc374f56cc8 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:28:33 2020 -0700 fix encoding commit 4bd8892c2f0e0fa3666e59b0b77f5b23a2e4ca50 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:26:00 2020 -0700 fix xunit order commit e28556b37ecd782df2d740321e782622ecd277ca Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:10:20 2020 -0700 fix spacing SA1012 SA1004 commit e8cf4b1e0be951babe04cc3674e17718319b8476 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:04:44 2020 -0700 fix SA1211 commit b4164446f7f9d82fb872243e59e3f5c46fbb1f3c Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:02:34 2020 -0700 fix attribute related warning commit 2f17ef45947f6ade36593ede6ba4d27bd1991508 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:56:53 2020 -0700 allow ca1801 ca1052 ca1054 commit 49b857f3f1b4a44a809c9186108caab0412c101e Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:50:07 2020 -0700 fix SA1001 commit 3389662a32cfc481a3fdf50b6fd651e23aadd9dd Author: Boshi LIAN <bolian@microsoft.com> Date: Fri Oct 9 06:24:32 2020 -0700 fix dotnet format commit f9d55fc925e8a7d2f2b403bd3ae35673068134da Merge: 8e81532 0d68823 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:44:30 2020 -0700 Merge branch 'master' into style_fix0 commit 8e815324040837714efb323580cc5dcd79e58310 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:33:02 2020 -0700 fix remaing build err commit ecf0152f9e989c4c68274b488d4b3ed6ee88daf9 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:24:00 2020 -0700 fix SA1707 commit 462d94794848ebfcd102b56a4344ffc33b50f591 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:19:38 2020 -0700 fix underscore naming commit 5271b113603e469021348523f19555e6be22aebc Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:19:12 2020 -0700 allow CA1822 commit 602713ce631026e88d8ff7e8803bb12c2addc3c2 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:37:16 2020 -0700 fix CA1822 commit bd4fee4d31c1054eadf6d03aa10f443eee9654c0 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:36:36 2020 -0700 fix CA1822 commit 257d461f21ef7df65fbc787d5c42c59a89d0eced Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:34:25 2020 -0700 introduce dispose pattern commit 1d668c7926f877ea196edb67acbfe9bfeddb9e15 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:23:09 2020 -0700 allow CA2008 commit e4fa6acaf36b84298c8c2ab125ff8aa9efc097b7 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:20:28 2020 -0700 allow CA1827 commit dd931d99fa3a95f936ed566320fffa85efb22838 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:14:35 2020 -0700 allow SA1314 CA1825 commit 13b6cf11df439be8020e17bc5d30addc62f90c39 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:13:51 2020 -0700 Revert "fix CA1825" This reverts commit 17e03bcd4e0f129a64e57d54fbe72acb7d1d226b. commit 368664139c75d61ab5a0c432a7fbbdad956c54cf Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:09:52 2020 -0700 move class to single files commit 0015631805d6bc31e4695881989058bb3955766f Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:09:27 2020 -0700 disable CA2000 / TODO commit 0a1241e84ba1247c8ab4ab8d32bd5d800114420b Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:07:23 2020 -0700 allow SA1715 commit 17e03bcd4e0f129a64e57d54fbe72acb7d1d226b Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:06:57 2020 -0700 fix CA1825 commit 7baf350ca93cb45e2587d86fb6ab6e4cf665b6da Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:42:04 2020 -0700 fix SA1312 SA1306 commit 44ad5934182adfc871215637e9612295bc26e6f2 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:30:35 2020 -0700 fix CA2007 commit 325fa2c2d16d541db6e21b791c5170f39f832d43 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:25:11 2020 -0700 fix SA1131 commit 8f1f46b065dd7e9b316491676bb0b93ef91d0595 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:17:08 2020 -0700 allow SA1119 commit 57c0fe7cc26932cc30b4d7cc75a809746d74d5aa Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:14:14 2020 -0700 fix SA1400 commit 0afcbbc09d5ef66fbbd4b291d14e7804a8e5a1d3 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:12:18 2020 -0700 fix SA1513 commit 45f2424531d35a2a106e10e788aff1a18d745078 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:09:17 2020 -0700 allow ca1720 ca1716 sa1405 commit 3403814130a1bf730c4e275f74e9cf5d03bedb41 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:16:37 2020 -0700 fix model oper not contains generated header commit 11377d916cf8cd3ad9109388aff6cf989ff4b7b0 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:14:05 2020 -0700 fix SA1649 commit 92b00051a8c80542a63e1dddbb6eed4e98ad26f9 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:11:16 2020 -0700 fix SA1124 commit 901a9dd2426fa316bcc5a3c2fc411e583f0e07df Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:09:27 2020 -0700 save 1122 commit a8f17b6bac1f1c115b7ed9ebb70d16697a3e81b7 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:09:07 2020 -0700 1507 followup commit a143184921abb38a09e28a7ef07379003fb19563 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:07:38 2020 -0700 fix sa1507 commit 54b56026265cbbbfa6e5b8b4dcfab281ffbfa272 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:06:44 2020 -0700 fix sa1513 commit 53a009205c88a1d63d8daf32599bbc6428619638 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:05:36 2020 -0700 fix SA1649 commit 26d3e78f61ffc381887baaf5c8b56d92aa0ec563 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:01:01 2020 -0700 fix ca1816 commit 1ce5a04ce7a32d901cbece3e18d59e3c068cfd27 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 01:56:43 2020 -0700 readable ruleset commit dafc55f1c2cdc8466919276291333ba46176161a Author: Boshi Lian <farmer1992@gmail.com> Date: Wed May 27 19:13:56 2020 -0700 sync none from guideline
2020-10-23 08:31:57 -07:00
if (_unitlessValue > -1024 && _unitlessValue < 1024)
{
return Suffixer.AppendMaxSuffix(_unitlessValue, SuffixFormat.DecimalSI);
}
if (HasMantissa(_unitlessValue))
{
return Suffixer.AppendMaxSuffix(_unitlessValue, SuffixFormat.DecimalSI);
}
}
return Suffixer.AppendMaxSuffix(_unitlessValue, suffixFormat);
}
// ctor
partial void CustomInit()
{
if (Value == null)
{
// No value has been defined, initialize to 0.
_unitlessValue = new Fraction(0);
Format = SuffixFormat.BinarySI;
return;
}
var value = Value.Trim();
var si = value.IndexOfAny(SuffixChars);
if (si == -1)
{
si = value.Length;
}
var literal = Fraction.FromString(value.Substring(0, si), CultureInfo.InvariantCulture);
var suffixer = new Suffixer(value.Substring(si));
_unitlessValue = literal.Multiply(Fraction.Pow(suffixer.Base, suffixer.Exponent));
Format = suffixer.Format;
if (Format == SuffixFormat.BinarySI && _unitlessValue > Fraction.FromDecimal(MaxAllowed))
{
_unitlessValue = Fraction.FromDecimal(MaxAllowed);
}
}
private static bool HasMantissa(Fraction value)
{
if (value.IsZero)
{
return false;
}
return BigInteger.Remainder(value.Numerator, value.Denominator) > 0;
}
/// <inheritdoc/>
public void Read(IParser parser, Type expectedType, ObjectDeserializer nestedObjectDeserializer)
{
if (expectedType != typeof(ResourceQuantity))
{
throw new ArgumentOutOfRangeException(nameof(expectedType));
}
if (parser?.Current is Scalar)
{
Value = ((Scalar)parser.Current).Value;
parser.MoveNext();
CustomInit();
}
}
/// <inheritdoc/>
public void Write(IEmitter emitter, ObjectSerializer nestedObjectSerializer)
{
emitter?.Emit(new Scalar(ToString()));
}
2021-09-14 11:22:04 -07:00
public static implicit operator decimal(ResourceQuantity v)
{
return v?.ToDecimal() ?? 0;
}
public static implicit operator ResourceQuantity(decimal v)
{
return new ResourceQuantity(v, 0, SuffixFormat.DecimalExponent);
}
private sealed class Suffixer
{
private static readonly IReadOnlyDictionary<string, (int, int)> BinSuffixes =
new Dictionary<string, (int, int)>
{
// Don't emit an error when trying to produce
// a suffix for 2^0.
Squashed commit of the following: (#492) commit dc93612024202e651a9cbe4194c1495c823bff12 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:24:33 2020 -0700 fix SA1505 commit dc9fdbc4a4fbce7f4362a24e1ff98be4d27e16a8 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:24:02 2020 -0700 add () commit 16fb7357fcd7e288a4b8fb201fda2b0aae92e5bc Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:21:37 2020 -0700 disable SA1117 commit 544a7e5891e853e2e222f855e5446f3fd79ce2ba Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:21:16 2020 -0700 fix SA1508 commit 4e998adf440dda4f13512d1e10f8cb5d5fbc6bd9 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:08:28 2020 -0700 allow sa1623 commit baf787255c657a00a6074598c6875e0ab4c9d065 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:07:23 2020 -0700 fix SA1413 commit 5ef2ca65de62e6c3cbe513902e3954d78f6dc315 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:05:45 2020 -0700 fix SA1413 commit 6cb71f08060b8252a18b01a5788eb2ddcee67c3e Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:44:55 2020 -0700 fix throw stack commit e6ada0b1cb3aa72df5fcaa0b4690aadcbd4bda5a Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:44:35 2020 -0700 allow CA2225 commit 2e79edec5843c20b7e8f8e9ec5b61cf95284466a Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:35:50 2020 -0700 allow SA1507 commit 108f5a6361f4faa211a8e01f783803295fac0453 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:35:31 2020 -0700 force SA1413 commit 20f33b64972bfafeada513ae1a46a030934673fd Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:30:58 2020 -0700 force SA1413 commit 6b0de102d68a116e149868731e155bc374f56cc8 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:28:33 2020 -0700 fix encoding commit 4bd8892c2f0e0fa3666e59b0b77f5b23a2e4ca50 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:26:00 2020 -0700 fix xunit order commit e28556b37ecd782df2d740321e782622ecd277ca Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:10:20 2020 -0700 fix spacing SA1012 SA1004 commit e8cf4b1e0be951babe04cc3674e17718319b8476 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:04:44 2020 -0700 fix SA1211 commit b4164446f7f9d82fb872243e59e3f5c46fbb1f3c Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:02:34 2020 -0700 fix attribute related warning commit 2f17ef45947f6ade36593ede6ba4d27bd1991508 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:56:53 2020 -0700 allow ca1801 ca1052 ca1054 commit 49b857f3f1b4a44a809c9186108caab0412c101e Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:50:07 2020 -0700 fix SA1001 commit 3389662a32cfc481a3fdf50b6fd651e23aadd9dd Author: Boshi LIAN <bolian@microsoft.com> Date: Fri Oct 9 06:24:32 2020 -0700 fix dotnet format commit f9d55fc925e8a7d2f2b403bd3ae35673068134da Merge: 8e81532 0d68823 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:44:30 2020 -0700 Merge branch 'master' into style_fix0 commit 8e815324040837714efb323580cc5dcd79e58310 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:33:02 2020 -0700 fix remaing build err commit ecf0152f9e989c4c68274b488d4b3ed6ee88daf9 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:24:00 2020 -0700 fix SA1707 commit 462d94794848ebfcd102b56a4344ffc33b50f591 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:19:38 2020 -0700 fix underscore naming commit 5271b113603e469021348523f19555e6be22aebc Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:19:12 2020 -0700 allow CA1822 commit 602713ce631026e88d8ff7e8803bb12c2addc3c2 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:37:16 2020 -0700 fix CA1822 commit bd4fee4d31c1054eadf6d03aa10f443eee9654c0 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:36:36 2020 -0700 fix CA1822 commit 257d461f21ef7df65fbc787d5c42c59a89d0eced Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:34:25 2020 -0700 introduce dispose pattern commit 1d668c7926f877ea196edb67acbfe9bfeddb9e15 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:23:09 2020 -0700 allow CA2008 commit e4fa6acaf36b84298c8c2ab125ff8aa9efc097b7 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:20:28 2020 -0700 allow CA1827 commit dd931d99fa3a95f936ed566320fffa85efb22838 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:14:35 2020 -0700 allow SA1314 CA1825 commit 13b6cf11df439be8020e17bc5d30addc62f90c39 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:13:51 2020 -0700 Revert "fix CA1825" This reverts commit 17e03bcd4e0f129a64e57d54fbe72acb7d1d226b. commit 368664139c75d61ab5a0c432a7fbbdad956c54cf Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:09:52 2020 -0700 move class to single files commit 0015631805d6bc31e4695881989058bb3955766f Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:09:27 2020 -0700 disable CA2000 / TODO commit 0a1241e84ba1247c8ab4ab8d32bd5d800114420b Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:07:23 2020 -0700 allow SA1715 commit 17e03bcd4e0f129a64e57d54fbe72acb7d1d226b Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:06:57 2020 -0700 fix CA1825 commit 7baf350ca93cb45e2587d86fb6ab6e4cf665b6da Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:42:04 2020 -0700 fix SA1312 SA1306 commit 44ad5934182adfc871215637e9612295bc26e6f2 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:30:35 2020 -0700 fix CA2007 commit 325fa2c2d16d541db6e21b791c5170f39f832d43 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:25:11 2020 -0700 fix SA1131 commit 8f1f46b065dd7e9b316491676bb0b93ef91d0595 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:17:08 2020 -0700 allow SA1119 commit 57c0fe7cc26932cc30b4d7cc75a809746d74d5aa Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:14:14 2020 -0700 fix SA1400 commit 0afcbbc09d5ef66fbbd4b291d14e7804a8e5a1d3 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:12:18 2020 -0700 fix SA1513 commit 45f2424531d35a2a106e10e788aff1a18d745078 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:09:17 2020 -0700 allow ca1720 ca1716 sa1405 commit 3403814130a1bf730c4e275f74e9cf5d03bedb41 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:16:37 2020 -0700 fix model oper not contains generated header commit 11377d916cf8cd3ad9109388aff6cf989ff4b7b0 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:14:05 2020 -0700 fix SA1649 commit 92b00051a8c80542a63e1dddbb6eed4e98ad26f9 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:11:16 2020 -0700 fix SA1124 commit 901a9dd2426fa316bcc5a3c2fc411e583f0e07df Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:09:27 2020 -0700 save 1122 commit a8f17b6bac1f1c115b7ed9ebb70d16697a3e81b7 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:09:07 2020 -0700 1507 followup commit a143184921abb38a09e28a7ef07379003fb19563 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:07:38 2020 -0700 fix sa1507 commit 54b56026265cbbbfa6e5b8b4dcfab281ffbfa272 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:06:44 2020 -0700 fix sa1513 commit 53a009205c88a1d63d8daf32599bbc6428619638 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:05:36 2020 -0700 fix SA1649 commit 26d3e78f61ffc381887baaf5c8b56d92aa0ec563 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:01:01 2020 -0700 fix ca1816 commit 1ce5a04ce7a32d901cbece3e18d59e3c068cfd27 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 01:56:43 2020 -0700 readable ruleset commit dafc55f1c2cdc8466919276291333ba46176161a Author: Boshi Lian <farmer1992@gmail.com> Date: Wed May 27 19:13:56 2020 -0700 sync none from guideline
2020-10-23 08:31:57 -07:00
{ "", (2, 0) },
{ "Ki", (2, 10) },
{ "Mi", (2, 20) },
{ "Gi", (2, 30) },
{ "Ti", (2, 40) },
{ "Pi", (2, 50) },
{ "Ei", (2, 60) },
};
private static readonly IReadOnlyDictionary<string, (int, int)> DecSuffixes =
new Dictionary<string, (int, int)>
{
Squashed commit of the following: (#492) commit dc93612024202e651a9cbe4194c1495c823bff12 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:24:33 2020 -0700 fix SA1505 commit dc9fdbc4a4fbce7f4362a24e1ff98be4d27e16a8 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:24:02 2020 -0700 add () commit 16fb7357fcd7e288a4b8fb201fda2b0aae92e5bc Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:21:37 2020 -0700 disable SA1117 commit 544a7e5891e853e2e222f855e5446f3fd79ce2ba Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:21:16 2020 -0700 fix SA1508 commit 4e998adf440dda4f13512d1e10f8cb5d5fbc6bd9 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:08:28 2020 -0700 allow sa1623 commit baf787255c657a00a6074598c6875e0ab4c9d065 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:07:23 2020 -0700 fix SA1413 commit 5ef2ca65de62e6c3cbe513902e3954d78f6dc315 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 16:05:45 2020 -0700 fix SA1413 commit 6cb71f08060b8252a18b01a5788eb2ddcee67c3e Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:44:55 2020 -0700 fix throw stack commit e6ada0b1cb3aa72df5fcaa0b4690aadcbd4bda5a Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:44:35 2020 -0700 allow CA2225 commit 2e79edec5843c20b7e8f8e9ec5b61cf95284466a Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:35:50 2020 -0700 allow SA1507 commit 108f5a6361f4faa211a8e01f783803295fac0453 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:35:31 2020 -0700 force SA1413 commit 20f33b64972bfafeada513ae1a46a030934673fd Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:30:58 2020 -0700 force SA1413 commit 6b0de102d68a116e149868731e155bc374f56cc8 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:28:33 2020 -0700 fix encoding commit 4bd8892c2f0e0fa3666e59b0b77f5b23a2e4ca50 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:26:00 2020 -0700 fix xunit order commit e28556b37ecd782df2d740321e782622ecd277ca Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:10:20 2020 -0700 fix spacing SA1012 SA1004 commit e8cf4b1e0be951babe04cc3674e17718319b8476 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:04:44 2020 -0700 fix SA1211 commit b4164446f7f9d82fb872243e59e3f5c46fbb1f3c Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 06:02:34 2020 -0700 fix attribute related warning commit 2f17ef45947f6ade36593ede6ba4d27bd1991508 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:56:53 2020 -0700 allow ca1801 ca1052 ca1054 commit 49b857f3f1b4a44a809c9186108caab0412c101e Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:50:07 2020 -0700 fix SA1001 commit 3389662a32cfc481a3fdf50b6fd651e23aadd9dd Author: Boshi LIAN <bolian@microsoft.com> Date: Fri Oct 9 06:24:32 2020 -0700 fix dotnet format commit f9d55fc925e8a7d2f2b403bd3ae35673068134da Merge: 8e81532 0d68823 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:44:30 2020 -0700 Merge branch 'master' into style_fix0 commit 8e815324040837714efb323580cc5dcd79e58310 Author: Boshi Lian <farmer1992@gmail.com> Date: Fri Oct 9 05:33:02 2020 -0700 fix remaing build err commit ecf0152f9e989c4c68274b488d4b3ed6ee88daf9 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:24:00 2020 -0700 fix SA1707 commit 462d94794848ebfcd102b56a4344ffc33b50f591 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:19:38 2020 -0700 fix underscore naming commit 5271b113603e469021348523f19555e6be22aebc Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 05:19:12 2020 -0700 allow CA1822 commit 602713ce631026e88d8ff7e8803bb12c2addc3c2 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:37:16 2020 -0700 fix CA1822 commit bd4fee4d31c1054eadf6d03aa10f443eee9654c0 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:36:36 2020 -0700 fix CA1822 commit 257d461f21ef7df65fbc787d5c42c59a89d0eced Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:34:25 2020 -0700 introduce dispose pattern commit 1d668c7926f877ea196edb67acbfe9bfeddb9e15 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:23:09 2020 -0700 allow CA2008 commit e4fa6acaf36b84298c8c2ab125ff8aa9efc097b7 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:20:28 2020 -0700 allow CA1827 commit dd931d99fa3a95f936ed566320fffa85efb22838 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:14:35 2020 -0700 allow SA1314 CA1825 commit 13b6cf11df439be8020e17bc5d30addc62f90c39 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:13:51 2020 -0700 Revert "fix CA1825" This reverts commit 17e03bcd4e0f129a64e57d54fbe72acb7d1d226b. commit 368664139c75d61ab5a0c432a7fbbdad956c54cf Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:09:52 2020 -0700 move class to single files commit 0015631805d6bc31e4695881989058bb3955766f Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:09:27 2020 -0700 disable CA2000 / TODO commit 0a1241e84ba1247c8ab4ab8d32bd5d800114420b Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:07:23 2020 -0700 allow SA1715 commit 17e03bcd4e0f129a64e57d54fbe72acb7d1d226b Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 04:06:57 2020 -0700 fix CA1825 commit 7baf350ca93cb45e2587d86fb6ab6e4cf665b6da Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:42:04 2020 -0700 fix SA1312 SA1306 commit 44ad5934182adfc871215637e9612295bc26e6f2 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:30:35 2020 -0700 fix CA2007 commit 325fa2c2d16d541db6e21b791c5170f39f832d43 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:25:11 2020 -0700 fix SA1131 commit 8f1f46b065dd7e9b316491676bb0b93ef91d0595 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:17:08 2020 -0700 allow SA1119 commit 57c0fe7cc26932cc30b4d7cc75a809746d74d5aa Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:14:14 2020 -0700 fix SA1400 commit 0afcbbc09d5ef66fbbd4b291d14e7804a8e5a1d3 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:12:18 2020 -0700 fix SA1513 commit 45f2424531d35a2a106e10e788aff1a18d745078 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 03:09:17 2020 -0700 allow ca1720 ca1716 sa1405 commit 3403814130a1bf730c4e275f74e9cf5d03bedb41 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:16:37 2020 -0700 fix model oper not contains generated header commit 11377d916cf8cd3ad9109388aff6cf989ff4b7b0 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:14:05 2020 -0700 fix SA1649 commit 92b00051a8c80542a63e1dddbb6eed4e98ad26f9 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:11:16 2020 -0700 fix SA1124 commit 901a9dd2426fa316bcc5a3c2fc411e583f0e07df Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:09:27 2020 -0700 save 1122 commit a8f17b6bac1f1c115b7ed9ebb70d16697a3e81b7 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:09:07 2020 -0700 1507 followup commit a143184921abb38a09e28a7ef07379003fb19563 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:07:38 2020 -0700 fix sa1507 commit 54b56026265cbbbfa6e5b8b4dcfab281ffbfa272 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:06:44 2020 -0700 fix sa1513 commit 53a009205c88a1d63d8daf32599bbc6428619638 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:05:36 2020 -0700 fix SA1649 commit 26d3e78f61ffc381887baaf5c8b56d92aa0ec563 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 02:01:01 2020 -0700 fix ca1816 commit 1ce5a04ce7a32d901cbece3e18d59e3c068cfd27 Author: Boshi Lian <farmer1992@gmail.com> Date: Wed Oct 7 01:56:43 2020 -0700 readable ruleset commit dafc55f1c2cdc8466919276291333ba46176161a Author: Boshi Lian <farmer1992@gmail.com> Date: Wed May 27 19:13:56 2020 -0700 sync none from guideline
2020-10-23 08:31:57 -07:00
{ "n", (10, -9) },
{ "u", (10, -6) },
{ "m", (10, -3) },
{ "", (10, 0) },
{ "k", (10, 3) },
{ "M", (10, 6) },
{ "G", (10, 9) },
{ "T", (10, 12) },
{ "P", (10, 15) },
{ "E", (10, 18) },
};
public Suffixer(string suffix)
{
// looked up
{
if (DecSuffixes.TryGetValue(suffix, out var be))
{
(Base, Exponent) = be;
Format = SuffixFormat.DecimalSI;
return;
}
}
{
if (BinSuffixes.TryGetValue(suffix, out var be))
{
(Base, Exponent) = be;
Format = SuffixFormat.BinarySI;
return;
}
}
if (char.ToLower(suffix[0]) == 'e')
{
Base = 10;
Exponent = int.Parse(suffix.Substring(1));
Format = SuffixFormat.DecimalExponent;
return;
}
throw new ArgumentException("unable to parse quantity's suffix");
}
public SuffixFormat Format { get; }
public int Base { get; }
public int Exponent { get; }
public static string AppendMaxSuffix(Fraction value, SuffixFormat format)
{
if (value.IsZero)
{
return "0";
}
switch (format)
{
case SuffixFormat.DecimalExponent:
{
var minE = -9;
var lastv = Roundup(value * Fraction.Pow(10, -minE));
2020-04-22 12:15:45 -07:00
for (var exp = minE; ; exp += 3)
{
var v = value * Fraction.Pow(10, -exp);
if (HasMantissa(v))
{
break;
}
minE = exp;
lastv = v;
}
if (minE == 0)
{
2020-04-22 12:15:45 -07:00
return $"{(decimal)lastv}";
}
2020-04-22 12:15:45 -07:00
return $"{(decimal)lastv}e{minE}";
}
case SuffixFormat.BinarySI:
return AppendMaxSuffix(value, BinSuffixes);
case SuffixFormat.DecimalSI:
return AppendMaxSuffix(value, DecSuffixes);
default:
throw new ArgumentOutOfRangeException(nameof(format), format, null);
}
}
private static string AppendMaxSuffix(Fraction value, IReadOnlyDictionary<string, (int, int)> suffixes)
{
var min = suffixes.First();
var suffix = min.Key;
var lastv = Roundup(value * Fraction.Pow(min.Value.Item1, -min.Value.Item2));
foreach (var kv in suffixes.Skip(1))
{
var v = value * Fraction.Pow(kv.Value.Item1, -kv.Value.Item2);
if (HasMantissa(v))
{
break;
}
suffix = kv.Key;
lastv = v;
}
2020-04-22 12:15:45 -07:00
return $"{(decimal)lastv}{suffix}";
}
private static Fraction Roundup(Fraction lastv)
{
var round = BigInteger.DivRem(lastv.Numerator, lastv.Denominator, out var remainder);
if (!remainder.IsZero)
{
lastv = round + 1;
}
return lastv;
}
}
public int ToInt32()
{
return _unitlessValue.ToInt32();
}
public long ToInt64()
{
return _unitlessValue.ToInt64();
}
public uint ToUInt32()
{
return _unitlessValue.ToUInt32();
}
public ulong ToUInt64()
{
return _unitlessValue.ToUInt64();
}
public BigInteger ToBigInteger()
{
return _unitlessValue.ToBigInteger();
}
public decimal ToDecimal()
{
return _unitlessValue.ToDecimal();
}
public double ToDouble()
{
return _unitlessValue.ToDouble();
}
}
}