[Serializable]
public struct ArraySegment <T> {
T [] array;
- int offset, length;
+ int offset, count;
- public ArraySegment (T [] array, int offset, int length)
+ public ArraySegment (T [] array, int offset, int count)
{
if (array == null)
throw new ArgumentNullException ("array");
- if (offset >= array.Length || (offset + length) >= array.Length)
+ if (offset < 0)
+ throw new ArgumentOutOfRangeException ("offset", "Non-negative number required.");
+
+ if (count < 0)
+ throw new ArgumentOutOfRangeException ("count", "Non-negative number required.");
+
+ if (offset > array.Length)
throw new ArgumentException ("out of bounds");
+
+ // now offset is valid, or just beyond the end.
+ // Check count -- do it this way to avoid overflow on 'offset + count'
+ if (array.Length - offset < count)
+ throw new ArgumentException ("out of bounds", "offset");
this.array = array;
this.offset = offset;
- this.length = length;
+ this.count = count;
}
public ArraySegment (T [] array)
this.array = array;
this.offset = 0;
- this.length = array.Length;
+ this.count = array.Length;
}
public T [] Array {
}
public int Count {
- get { return length; }
+ get { return count; }
}
}
}
-#endif
\ No newline at end of file
+#endif
--- /dev/null
+// ArraySegmentTest.cs - NUnit Test Cases for the System.ArraySegment class
+//
+// Ankit Jain <jankit@novell.com>
+// Raja R Harinath <rharinath@novell.com>
+//
+// Copyright (C) 2006 Novell, Inc (http://www.novell.com)
+//
+
+#if NET_2_0
+using NUnit.Framework;
+using System;
+using System.Collections.Generic;
+
+namespace MonoTests.System
+{
+
+[TestFixture]
+public class ArraySegmentTest
+{
+ public ArraySegmentTest() {}
+
+ [Test]
+ public void CtorTest1 ()
+ {
+ byte [] b_arr = new byte [4096];
+ Array arr;
+
+ ArraySegment<byte> seg = new ArraySegment<byte> (b_arr, 0, b_arr.Length);
+ Assert.AreEqual (seg.Count, b_arr.Length, "#1");
+ Assert.AreEqual (seg.Offset, 0, "#2");
+
+ arr = seg.Array;
+ Assert.AreEqual (arr.Length, 4096, "#5");
+
+ seg = new ArraySegment<byte> (b_arr, 100, b_arr.Length - 100);
+ Assert.AreEqual (seg.Count, b_arr.Length - 100, "#3");
+ Assert.AreEqual (seg.Offset, 100, "#4");
+
+ arr = seg.Array;
+ Assert.AreEqual (arr.Length, 4096, "#5");
+ }
+
+ [Test]
+ public void CtorTest2 ()
+ {
+ byte [] b_arr = new byte [4096];
+ ArraySegment<byte> seg = new ArraySegment<byte> (b_arr);
+ Assert.AreEqual (seg.Count, b_arr.Length, "#6");
+ Assert.AreEqual (seg.Offset, 0, "#7");
+
+ Array arr = seg.Array;
+ Assert.AreEqual (arr.Length, 4096, "#8");
+ }
+
+ [Test]
+ public void CtorTest3 ()
+ {
+ EmptyArraySegTest (0);
+ EmptyArraySegTest (10);
+ }
+
+ private void EmptyArraySegTest (int len)
+ {
+ byte [] b_arr = new byte [len];
+
+ ArraySegment<byte> seg = new ArraySegment<byte> (b_arr, 0, b_arr.Length);
+
+ Assert.AreEqual (seg.Count, b_arr.Length, "#1 [array len {0}] ", len);
+ Assert.AreEqual (seg.Offset, 0, "#2 [array len {0}] ", len);
+ Array arr = seg.Array;
+ Assert.AreEqual (arr.Length, len, "#3 [array len {0}] ", len);
+
+ seg = new ArraySegment<byte> (b_arr, b_arr.Length, 0);
+ Assert.AreEqual (seg.Count, 0, "#4 [array len {0}] ", len);
+ Assert.AreEqual (seg.Offset, b_arr.Length, "#5 [array len {0}] ", len);
+ arr = seg.Array;
+ Assert.AreEqual (arr.Length, len, "#6 [array len {0}] ", len);
+
+ seg = new ArraySegment<byte> (b_arr);
+ Assert.AreEqual (seg.Count, b_arr.Length, "#7 [array len {0}] ", len);
+ Assert.AreEqual (seg.Offset, 0, "#8 [array len {0}] ", len);
+ arr = seg.Array;
+ Assert.AreEqual (arr.Length, len, "#9 [array len {0}] ", len);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void CtorErrorTest ()
+ {
+ byte [] arr = new byte [4096];
+ ArraySegment<byte> seg = new ArraySegment<byte> (arr, 1, arr.Length);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void CtorErrorTest2 ()
+ {
+ byte [] arr = new byte [4096];
+ ArraySegment<byte> seg = new ArraySegment<byte> (arr, 0, arr.Length + 2);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentOutOfRangeException))]
+ public void CtorErrorTest3 ()
+ {
+ byte [] arr = new byte [4096];
+ ArraySegment<byte> seg = new ArraySegment<byte> (arr, -1, arr.Length);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentOutOfRangeException))]
+ public void CtorErrorTest4 ()
+ {
+ byte [] arr = new byte [4096];
+ ArraySegment<byte> seg = new ArraySegment<byte> (arr, 2, -1);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentException))]
+ public void CtorErrorTest5 ()
+ {
+ byte [] arr = new byte [4096];
+ ArraySegment<byte> seg = new ArraySegment<byte> (arr, 0, arr.Length + 2);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void CtorNullTest1 ()
+ {
+ ArraySegment<byte> seg = new ArraySegment<byte> (null, 0 , 1);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void CtorNullTest2 ()
+ {
+ ArraySegment<byte> seg = new ArraySegment<byte> (null);
+ }
+
+
+#endif
+}
+
+}