private Object [ ] buildFromRange ( int offset , int keyLength , boolean isLeaf , boolean isExtra ) { // if keyLength is 0, we didn't copy anything from the original, which means we didn't // modify any of the range owned by it, so can simply return it as is if ( keyLength == 0 ) return copyFrom ; Object [ ] a ; if ( isLeaf ) { a = new Object [ keyLength + ( keyLength & 1 ) ] ; System . arraycopy ( buildKeys , offset , a , 0 , keyLength ) ; } else { a = new Object [ 1 + ( keyLength * 2 ) ] ; System . arraycopy ( buildKeys , offset , a , 0 , keyLength ) ; System . arraycopy ( buildChildren , offset , a , keyLength , keyLength + 1 ) ; } if ( isExtra ) updateFunction . allocated ( ObjectSizes . sizeOfArray ( a ) ) ; else if ( a . length != copyFrom . length ) updateFunction . allocated ( ObjectSizes . sizeOfArray ( a ) - ( copyFrom . length == 0 ? 0 : ObjectSizes . sizeOfArray ( copyFrom ) ) ) ; return a ; }
builds and returns a node from the buffered objects in the given range