The Labs \ Source Viewer \ SSCLI \ System \ ArraySegment

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*============================================================
  16. **
  17. ** Class:  ArraySegment<T>
  18. **
  19. **
  20. ** Purpose: Convenient wrapper for an array, an offset, and
  21. **          a count.  Ideally used in streams & collections.
  22. **          Net Classes will consume an array of these.
  23. **
  24. **
  25. ===========================================================*/
  26. using System.Runtime.InteropServices;
  27. namespace System
  28. {
  29.    
  30.     [Serializable()]
  31.     public struct ArraySegment<T>
  32.     {
  33.         private T[] _array;
  34.         private int _offset;
  35.         private int _count;
  36.        
  37.         public ArraySegment(T[] array)
  38.         {
  39.             if (array == null)
  40.                 throw new ArgumentNullException("array");
  41.            
  42.             _array = array;
  43.             _offset = 0;
  44.             _count = array.Length;
  45.         }
  46.        
  47.         public ArraySegment(T[] array, int offset, int count)
  48.         {
  49.             if (array == null)
  50.                 throw new ArgumentNullException("array");
  51.             if (offset < 0)
  52.                 throw new ArgumentOutOfRangeException("offset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  53.             if (count < 0)
  54.                 throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
  55.             if (array.Length - offset < count)
  56.                 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
  57.            
  58.             _array = array;
  59.             _offset = offset;
  60.             _count = count;
  61.         }
  62.        
  63.         public T[] Array {
  64.             get { return _array; }
  65.         }
  66.        
  67.         public int Offset {
  68.             get { return _offset; }
  69.         }
  70.        
  71.         public int Count {
  72.             get { return _count; }
  73.         }
  74.        
  75.         public override int GetHashCode()
  76.         {
  77.             return _array.GetHashCode() ^ _offset ^ _count;
  78.         }
  79.        
  80.         public override bool Equals(object obj)
  81.         {
  82.             if (obj is ArraySegment<T>)
  83.                 return Equals((ArraySegment<T>)obj);
  84.             else
  85.                 return false;
  86.         }
  87.        
  88.         public bool Equals(ArraySegment<T> obj)
  89.         {
  90.             return obj._array == _array && obj._offset == _offset && obj._count == _count;
  91.         }
  92.        
  93.         public static bool operator ==(ArraySegment<T> a, ArraySegment<T> b)
  94.         {
  95.             return a.Equals(b);
  96.         }
  97.        
  98.         public static bool operator !=(ArraySegment<T> a, ArraySegment<T> b)
  99.         {
  100.             return !(a == b);
  101.         }
  102.        
  103.     }
  104. }

Developer Fusion