using System; namespace Be.Timvw.Framework.Domain { public class Range : IRange where T : IComparable { #region Private Fields private T begin; private T end; #endregion #region Public Constructors public Range(T begin, T end) { if (begin.CompareTo(end) > 0) { throw new ArgumentOutOfRangeException("Invalid Range"); } this.begin = begin; this.end = end; } #endregion #region IRange Members public T Begin { get { return this.begin; } set { if (value.CompareTo(this.end) > 0) { throw new ArgumentOutOfRangeException("Invalid Range"); } this.begin = value; } } public T End { get { return this.end; } set { if (value.CompareTo(this.begin) < 0) { throw new ArgumentOutOfRangeException("Invalid Range"); } this.end = value; } } public bool Includes(T t) { if (begin.CompareTo(t) > 0) { return false; } if (end.CompareTo(t) < 0) { return false; } return true; } public bool Includes(IRange range) { return this.Includes(range.Begin) && this.Includes(range.End); } public bool Overlaps(IRange range) { return range.Includes(this.begin) || range.Includes(this.end) || this.Includes(range); } #endregion #region IComparable> Members public int CompareTo(IRange other) { int compareResult = this.begin.CompareTo(other.Begin); if (compareResult != 0) { return compareResult; } else { return this.end.CompareTo(other.End); } } #endregion #region Overriden Methods public override string ToString() { return string.Format("{0} - {1}", this.begin, this.end); } public override bool Equals(object obj) { if (obj == null) { return false; } if (obj.GetType() != typeof(Range)) { return false; } Range other = (Range)obj; if (this.begin.CompareTo(other.begin) != 0) { return false; } if (this.end.CompareTo(other.end) != 0) { return false; } return true; } public override int GetHashCode() { return string.Format("{0} - {1}", this.begin, this.end).GetHashCode(); } #endregion } }