public void CopyTo(SparseArray source, uint start)
{
var originalStart = start;
foreach (var sourceRange in source.Ranges)
{
int sourceOffset = 0;
start = originalStart + sourceRange.StartIndex;
do
{
// Get a reference to the array to copy to.
object[] dest = FindOrCreateArray(start, writeAccess: true);
int destOffset = (int)(start & NodeMask);
// Copy as much as possible.
int copyLength = Math.Min(sourceRange.Length - sourceOffset, dest.Length - destOffset);
Array.Copy(sourceRange.Array, sourceOffset, dest, destOffset, copyLength);
start += (uint)copyLength;
sourceOffset += copyLength;
} while (sourceOffset < sourceRange.Length);
}
}