private void addAll(final Object[] values, final int start, final int length) {
		if (length >= _buffer.length) {
			arraycopy(
				values, values.length - _buffer.length + start,
				_buffer, 0, _buffer.length
			);
			_size = _buffer.length;
			_index = 0;
		} else {
			final int remaining = _buffer.length - _index;
			_size = min(_size + length, _buffer.length);

			if (length <= remaining) {
				arraycopy(values, start, _buffer, _index, length);
				_index += length;
			} else {
				arraycopy(values, start, _buffer, _index, remaining);
				arraycopy(
					values, remaining + start,
					_buffer, 0, length - remaining
				);
				_index = length - remaining;
			}
		}
	}
Add the {@code values} of the given array to {@code this} buffer. The
values are added at the given {@code start} index and the given
{@code length}.

@param values the array which contains the values to add
@param start the start index of the source array
@param length the number of elements to copy
@throws IndexOutOfBoundsException if copying causes access of data
        outside array bounds
@throws ArrayStoreException if an element in the {@code value} array
        could not be stored into the dest array because of a type mismatch
jenetics/src/main/java/io/jenetics/util/Buffer.java