public static void Copy(ClusteredArray <T> source, int sourceIndex, ClusteredArray <T> destination, int destinationIndex, int length) { if (source == null) { throw new ArgumentNullException("source"); } if (destination == null) { throw new ArgumentNullException("destination"); } if (sourceIndex > source.Length) { throw new ArgumentOutOfRangeException("sourceIndex"); } if (destinationIndex > destination.Length) { throw new ArgumentOutOfRangeException("destinationIndex"); } if ((sourceIndex + length) > source.Length) { throw new ArgumentOutOfRangeException("length"); } if ((destinationIndex + length) > destination.Length) { throw new ArgumentOutOfRangeException("length"); } int lengthThreshold = source._lengthThreshold; VirtualIndex srcIndex = new VirtualIndex(source._lengthThreshold, sourceIndex); VirtualIndex dstIndex = new VirtualIndex(source._lengthThreshold, destinationIndex); int dataCopied = 0; while (dataCopied < length) { T[] srcArray = source._chunks[srcIndex.YIndex]; T[] dstArray = destination._chunks[dstIndex.YIndex]; int dataRemaining = length - dataCopied; int dstSpaceLeft = dstArray.Length - dstIndex.XIndex; int data2Copy = dataRemaining > dstSpaceLeft ? dstSpaceLeft : dataRemaining; int srcSpaceLeft = srcArray.Length - srcIndex.XIndex; if (data2Copy > srcSpaceLeft) { data2Copy = srcSpaceLeft; } Array.Copy(srcArray, srcIndex.XIndex, dstArray, dstIndex.XIndex, data2Copy); dataCopied += data2Copy; srcIndex.IncrementBy(data2Copy); dstIndex.IncrementBy(data2Copy); } }
/// <summary> /// Lê os dados da instancia. /// </summary> /// <param name="offset"></param> /// <param name="length"></param> /// <returns></returns> public VirtualArray Read(int offset, int length) { VirtualArray dst = null; int num = this.Length; if (offset >= num) { return(new VirtualArray(0)); } if ((offset + length) > num) { length -= (offset + length) - num; } VirtualArray src = new VirtualArray(_data); dst = new VirtualArray((long)length); VirtualIndex srcIndex = new VirtualIndex(offset); VirtualIndex dstIndex = new VirtualIndex(); VirtualArray.CopyData(src, srcIndex, dst, dstIndex, length); return(dst); }
public override VirtualArray Read(int offset, int length) { VirtualArray vBuffer = null; int streamLength = Length; if (offset >= streamLength) { return(new VirtualArray(0)); } if (offset + length > streamLength) { length -= (offset + length - streamLength); } VirtualArray vSrc = new VirtualArray(_data); vBuffer = new VirtualArray(length); VirtualIndex vSrcIndex = new VirtualIndex(offset); VirtualIndex vDstIndex = new VirtualIndex(); VirtualArray.CopyData(vSrc, vSrcIndex, vBuffer, vDstIndex, length); return(vBuffer); }