Reverse pack index implementation: PackReverseIndex
Let us quickly find ObjectId or next object for specified offset in a
pack, in O(log n) time.
Current implementation uses one level (reverse) indexing by an offset.
However, it tries to take small space as possible, by using 2 distinct
offset arrays for offsets with value smaller than 2^31 (int[]) and those
with value bigger than 2^31 (long[]). Offsets are stored ordered in
these 2 arrays.
Binary search search is performed during requests, then index in offsets
array is applied as index to the array of positions in straight
PackIndex, which finally gives ObjectId.
Reverse index is constructed from an existing PackIndex instance, by
lazy initialization in a PackFile instance.
Optimization-hacks-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Marek Zawirski <marek.zawirski@gmail.com>
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>