private void Add(ImmutableArrayInternal <T> array)
        {
            if (array.Length <= 0)
            {
                return;
            }

            array.IncreaseReferences();

            _arrays.Add(array);
            _offsets.Add(_length + array.Length);
            _length += array.Length;
        }
        public ImmutableArrayInternal(int sourceIndex, ImmutableArrayInternal <T> data, int length)
        {
            if ((sourceIndex < 0) || (sourceIndex >= data.Length))
            {
                throw new IndexOutOfRangeException("Index must be between 0 and upper array bound");
            }

            if (data == null)
            {
                throw new ArgumentNullException("data", "Array cannot be null");
            }

            if ((sourceIndex + length) > data.Length)
            {
                throw new ArgumentOutOfRangeException("The sourceIndex and length specified overcome the source ByteArray length");
            }

            _offset = data.Offset + sourceIndex;
            _data   = data.Data;
            _length = length;
            _source = data;
        }
        protected bool EqualsTo(ImmutableArrayInternal <T> array)
        {
            if (_length != array.Length)
            {
                return(false);
            }

            //fast compare
            if (this.GetHashCode() != array.GetHashCode())
            {
                return(false);
            }

            //slow compare
            for (int i = 0; i < _length; i++)
            {
                if (!this[i].Equals(array[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
 /// <summary>
 /// Creates an immutable array cloning the specified array
 /// </summary>
 /// <param name="data">Array to clone</param>
 /// <param name="length">Length of the data</param>
 /// <param name="sourceIndex">Index of the cloned array where to start cloning</param>
 public ImmutableArray(T[] data, int length, int sourceIndex)
 {
     this.Add(ImmutableArrayInternal <T> .Create(sourceIndex, data, length));
 }
 public ImmutableArrayInternal(ImmutableArrayInternal <T> data, int length)
     : this(0, data, length)
 {
 }
 public ImmutableArrayInternal(ImmutableArrayInternal <T> data)
     : this(data, data.Length)
 {
 }