Advertisement
Guest User

Range<T>

a guest
Jan 18th, 2012
434
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.94 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.ComponentModel;
  5. using System.Collections;
  6.  
  7. namespace SAS.Core.CommonObjects
  8. {
  9.     [TypeConverter(typeof(ExpandableObjectConverter))]
  10.     public class Range<T> : IEnumerable<T>
  11.         where T : IComparable<T>
  12.     {
  13.         private T m_Min;
  14.         private T m_Max;
  15.         private bool minIsSet;
  16.         private bool maxIsSet;
  17.  
  18.         public Range() { }
  19.         public Range(T min, T max) {
  20.             m_Min = min;
  21.             m_Max = max;
  22.         }
  23.  
  24.         public T Min {
  25.             get {
  26.                 return m_Min;
  27.             }
  28.             set {
  29.                 m_Min = value;
  30.                 minIsSet = true;
  31.             }
  32.         }
  33.  
  34.         public T Max {
  35.             get {
  36.                 return m_Max;
  37.             }
  38.             set {
  39.                 m_Max = value;
  40.                 maxIsSet = true;
  41.             }
  42.         }
  43.  
  44.         public T Size {
  45.             get {
  46.                 return Calculator.Difference(m_Max, m_Min);
  47.             }
  48.         }
  49.  
  50.         public bool Contains(T p) {
  51.             return p.CompareTo(m_Min) >= 0 && p.CompareTo(m_Max) <= 0;
  52.         }
  53.  
  54.         public void SetMinAN(T against) {
  55.             if (!minIsSet) {
  56.                 Min = against;
  57.             } else {
  58.                 m_Min = (against.CompareTo(m_Min) < 0) ? against : m_Min;
  59.             }
  60.         }
  61.  
  62.         public void SetMaxAN(T against) {
  63.             if (!maxIsSet) {
  64.                 Max = against;
  65.             } else {
  66.                 m_Max = (against.CompareTo(m_Max) > 0) ? against : m_Max;
  67.             }
  68.         }
  69.  
  70.         public void SetMinMaxAgainst(T val) {
  71.             SetMinAN(val);
  72.             SetMaxAN(val);
  73.         }
  74.  
  75.         public void SetMinMaxAgainst(Range<T> range) {
  76.             SetMinAN(range.Min);
  77.             SetMaxAN(range.Max);
  78.         }
  79.  
  80.         public override string ToString() {
  81.             return "Range [" + m_Min + ", " + m_Max + "]";
  82.         }
  83.  
  84.         private ICalculator<T> Calculator {
  85.             get {
  86.                 return Calculators.GetCalculator<T>();
  87.             }
  88.         }
  89.  
  90.         public void Add(object o) { }//--for Xml serialization
  91.  
  92.         IEnumerator IEnumerable.GetEnumerator() {
  93.             return (IEnumerator)new RangeEnumerator<T>(this);
  94.         }
  95.  
  96.         public IEnumerator<T> GetEnumerator() {
  97.             return (IEnumerator<T>)new RangeEnumerator<T>(this);
  98.         }
  99.  
  100.         /// <summary>
  101.         /// Gets the value between Min and Max based on a fraction.
  102.         /// </summary>
  103.         /// <param name="frac">a fraction e.g. 0.5 will return the mid-point</param>
  104.         public T GetFraction(T frac) {
  105.             return Calculator.Sum(m_Min, Calculator.Product(frac, Size));
  106.         }
  107.     }
  108.  
  109.     public class RangeEnumerator<T> : IEnumerator<T>
  110.         where T : IComparable<T>
  111.     {
  112.         private T en_Position;
  113.         Range<T> mRange;
  114.         public RangeEnumerator(Range<T> range) {
  115.             mRange = range;
  116.             Reset();
  117.         }
  118.  
  119.         public bool MoveNext() {
  120.             if (mRange.Size.CompareTo(en_Position) == 1) {//--i.e. if Size > en_Position
  121.                 en_Position = Calculator.Sum(en_Position, Calculator.One);
  122.                 return true;
  123.             }
  124.             return false;
  125.         }
  126.  
  127.         public void Reset() {
  128.             en_Position = Calculator.Difference(Calculator.Zero, Calculator.One);//i.e. -1
  129.         }
  130.  
  131.         private ICalculator<T> Calculator {
  132.             get {
  133.                 return Calculators.GetCalculator<T>();
  134.             }
  135.         }
  136.  
  137.         public object Current {
  138.             get {
  139.                 return Calculator.Sum(en_Position, mRange.Min);
  140.             }
  141.         }
  142.  
  143.         T IEnumerator<T>.Current {
  144.             get {
  145.                 return Calculator.Sum(en_Position, mRange.Min);
  146.             }
  147.         }
  148.  
  149.         public void Dispose() { }        
  150.     }
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement