Advertisement
Inverness

Mass struct

Jul 7th, 2014
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.22 KB | None | 0 0
  1. public struct Mass : IEquatable<Mass>, IComparable<Mass>
  2. {
  3.     public const long UnitsPerMilligram = 100000;
  4.     public const long UnitsPerGram = UnitsPerMilligram * 1000;
  5.     public const long UnitsPerKilogram = UnitsPerGram * 1000;
  6.     public const long UnitsPerPound = 45359237000;
  7.     public const long UnitsPerGrain = 6479891;
  8.  
  9.     public static readonly Mass Zero = new Mass(0);
  10.     public static readonly Mass MinValue = new Mass(long.MinValue);
  11.     public static readonly Mass MaxValue = new Mass(long.MaxValue);
  12.  
  13.     public static readonly Mass OneMilligram = new Mass(UnitsPerMilligram);
  14.     public static readonly Mass OneGram = new Mass(UnitsPerGram);
  15.     public static readonly Mass OneKilogram = new Mass(UnitsPerKilogram);
  16.     public static readonly Mass OnePound = new Mass(UnitsPerPound);
  17.     public static readonly Mass OneGrain = new Mass(UnitsPerGrain);
  18.  
  19.     private readonly long _units;
  20.  
  21.     internal Mass(long units)
  22.     {
  23.         _units = units;
  24.     }
  25.  
  26.     internal Mass(double value, long unitScale)
  27.     {
  28.         _units = (long) checked(value * unitScale);
  29.     }
  30.  
  31.     public double Milligrams
  32.     {
  33.         get { return _units * (1.0 / UnitsPerMilligram); }
  34.     }
  35.  
  36.     public double Grams
  37.     {
  38.         get { return _units * (1.0 / UnitsPerGram); }
  39.     }
  40.  
  41.     public double Kilograms
  42.     {
  43.         get { return _units * (1.0 / UnitsPerKilogram); }
  44.     }
  45.  
  46.     public double Grains
  47.     {
  48.         get { return _units * (1.0 / UnitsPerGrain); }
  49.     }
  50.  
  51.     public double Pounds
  52.     {
  53.         get { return _units * (1.0 / UnitsPerPound); }
  54.     }
  55.  
  56.     public override bool Equals(object obj)
  57.     {
  58.         if (obj is Mass)
  59.             return Equals((Mass) obj);
  60.         return false;
  61.     }
  62.  
  63.     public bool Equals(Mass other)
  64.     {
  65.         return _units == other._units;
  66.     }
  67.  
  68.     public bool Equals(Mass other, long tolerance)
  69.     {
  70.         return Math.Abs(_units - other._units) < tolerance;
  71.     }
  72.  
  73.     public bool EqualsMilligrams(Mass other)
  74.     {
  75.         return Equals(other, UnitsPerMilligram);
  76.     }
  77.  
  78.     public override int GetHashCode()
  79.     {
  80.         return _units.GetHashCode();
  81.     }
  82.  
  83.     public override string ToString()
  84.     {
  85.         return Kilograms.ToString();
  86.     }
  87.  
  88.     public int CompareTo(Mass other)
  89.     {
  90.         return _units.CompareTo(other._units);
  91.     }
  92.  
  93.     public static Mass FromUnits(long units)
  94.     {
  95.         return new Mass(units);
  96.     }
  97.  
  98.     public static Mass FromMilligrams(double value)
  99.     {
  100.         return new Mass(value, UnitsPerMilligram);
  101.     }
  102.     public static Mass FromGrams(double value)
  103.     {
  104.         return new Mass(value, UnitsPerGram);
  105.     }
  106.  
  107.     public static Mass FromKilograms(double value)
  108.     {
  109.         return new Mass(value, UnitsPerKilogram);
  110.     }
  111.  
  112.     public static Mass FromGrains(double value)
  113.     {
  114.         return new Mass(value, UnitsPerGrain);
  115.     }
  116.  
  117.     public static Mass FromPounds(double value)
  118.     {
  119.         return new Mass(value, UnitsPerPound);
  120.     }
  121.  
  122.     public static bool operator ==(Mass left, Mass right)
  123.     {
  124.         return left.Equals(right);
  125.     }
  126.  
  127.     public static bool operator !=(Mass left, Mass right)
  128.     {
  129.         return !left.Equals(right);
  130.     }
  131.  
  132.     public static bool operator <(Mass left, Mass right)
  133.     {
  134.         return left._units < right._units;
  135.     }
  136.  
  137.     public static bool operator >(Mass left, Mass right)
  138.     {
  139.         return left._units > right._units;
  140.     }
  141.  
  142.     public static bool operator <=(Mass left, Mass right)
  143.     {
  144.         return left._units <= right._units;
  145.     }
  146.  
  147.     public static bool operator >=(Mass left, Mass right)
  148.     {
  149.         return left._units >= right._units;
  150.     }
  151.  
  152.     public static Mass operator *(Mass left, Mass right)
  153.     {
  154.         return new Mass(checked(left._units * right._units));
  155.     }
  156.  
  157.     public static Mass operator *(Mass left, double right)
  158.     {
  159.         return new Mass(checked((long) (left._units * right)));
  160.     }
  161.  
  162.     public static Mass operator /(Mass left, Mass right)
  163.     {
  164.         return new Mass(checked(left._units / right._units));
  165.     }
  166.  
  167.     public static Mass operator /(Mass left, double right)
  168.     {
  169.         return new Mass(checked((long) (left._units / right)));
  170.     }
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement