Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        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);
        }