protected static class MultiBinaryLongMap.LongStorage extends Object
The first dimension is a sequence of "slots" (i.e. rows) that each hold one or more indexed values. The second dimension is a sequence of "indexes" (i.e. columns). A combination of a slot and an index is used to access or modify a specific long value.
Modifier and Type | Field and Description |
---|---|
protected static long[][] |
EMPTY
Empty storage.
|
protected long[][] |
m_aalStorage
The internal storage for the LongStorage, divided into segments, with each segment being an array of long values.
|
protected int |
m_cFree
The number of slots that are available ("free").
|
protected int |
m_cFreeThreshold
The number of free slots at which compression becomes indicated.
|
protected int |
m_cIndexes
The total number of indexes.
|
protected int |
m_cTotal
The total number of slots.
|
protected int |
m_iFreeSlot
The index of the first free slot, or -1.
|
Constructor and Description |
---|
LongStorage(int cIndexes)
Construct a LongStorage that will initially hold cIndexes columns of data.
|
Modifier and Type | Method and Description |
---|---|
int |
addIndex()
Add an additional index value to each slot.
|
protected static int |
calcFirstSlotIndex(int iSegment)
Given a segment index, determine the slot index of the first slot that is stored in the segment.
|
protected static int |
calcSegmentIndex(int iSlot)
Give a slot index, determine what segment index the slot will be found in.
|
protected static int |
calcSegmentSize(int iSegment)
Given an array segment index, determine the size of the array in slots.
|
void |
clear()
Reset the LongStorage to its initial empty state.
|
void |
compressBegin()
Begin the compression of the LongStorage into the minimum number of contiguous slots.
|
void |
compressEnd()
Complete the LongStorage compression process.
|
int |
compressRelocate(int iSlot)
Relocate a reserved slot from a slot index that is at or beyond
getSlotCount() . |
void |
copy(int iSlotSrc, int iSlotDest)
Copy the contents of one slot to another.
|
int |
countValues(int iIndex)
For any index > 0, count the number of values in the LongStorage that are non-zero.
|
long |
get(int iSlot, int iIndex)
Load a value.
|
int |
getCapacity()
Determine the current capacity (the actual number of slots for which storage has been allocated) in the LongStorage.
|
int |
getIndexCount()
Determine the number of indexes (columns) supported by the LongStorage.
|
int |
getSlotCount()
Determine the number of slots that have been reserved in the LongStorage.
|
protected void |
grow()
Add a new segment of slot storage.
|
boolean |
isCompressionIndicated()
Determine if the LongStorage should be compressed.
|
void |
put(int iSlot, int iIndex, long lValue)
Store a value.
|
protected void |
recalculateShrinkageThreshold()
Determine at what point the LongStorage should be compressed.
|
void |
releaseSlot(int iSlot)
Release a previously-reserved slot.
|
void |
removeIndex(int iIndex)
Remove an index value from each slot.
|
int |
reserveSlot()
Reserve a slot to use for storing information.
|
void |
reset(int iSlot)
Reset all of the values in a specified slot to zero.
|
protected static final long[][] EMPTY
protected long[][] m_aalStorage
m_cIndexes
elements after that. A slot is further divided into indexed values, with the first element of the slot containing the first indexed value, the second element of the slot containing the second indexed value, and so on.
For example: 16,16,16,16,32,32,32,32,64,64,64,64,128,128,128,128,256,...
protected int m_cIndexes
protected int m_cTotal
protected int m_cFree
protected int m_iFreeSlot
protected int m_cFreeThreshold
public LongStorage(int cIndexes)
cIndexes
- the number of values (i.e. columns) to hold for each slot (i.e. row)public int getIndexCount()
public int getSlotCount()
public int getCapacity()
Note: During the compression phase, the capacity is set to the number of slots in use, which is the level to which the LongStorage is compressed.
public int addIndex()
It is the responsibility of the caller to ensure that no multi-threaded access to the LongStorage occurs during this process.
public void removeIndex(int iIndex)
It is the responsibility of the caller to ensure that no multi-threaded access to the LongStorage occurs during this process.
iIndex
- the index identifier of the index value to removepublic int reserveSlot()
It is the responsibility of the caller to ensure that no multi-threaded access to the LongStorage occurs during this process.
protected void grow()
public void releaseSlot(int iSlot)
It is the responsibility of the caller to ensure that no multi-threaded access to the LongStorage occurs during this process.
iSlot
- the slot index to releasepublic void clear()
It is the responsibility of the caller to ensure that no multi-threaded access to the LongStorage occurs during this process.
public long get(int iSlot, int iIndex)
iSlot
- the slot index to load the value fromiIndex
- the value index from which to load the valuepublic void put(int iSlot, int iIndex, long lValue)
iSlot
- the slot index to store a value iniIndex
- the value index to store a value forlValue
- the value to store in the specified index of the specified slotpublic int countValues(int iIndex)
iIndex
- a valid index, other than the zero indexpublic void reset(int iSlot)
iSlot
- the slot index to resetpublic void copy(int iSlotSrc, int iSlotDest)
iSlotSrc
- the slot to copy fromiSlotDest
- the slot to copy toprotected void recalculateShrinkageThreshold()
public boolean isCompressionIndicated()
compressBegin()
public void compressBegin()
Compression is a 4-step process:
isCompressionIndicated()
;compressBegin()
;getSlotCount()
), the reservation must be relocated by calling compressRelocate(i)
;compressEnd()
.public int compressRelocate(int iSlot)
getSlotCount()
.iSlot
- a slot index for a reserved slot whose index is at or beyond getSlotCount()
compressBegin()
public void compressEnd()
compressBegin()
protected static int calcSegmentSize(int iSegment)
iSegment
- the segment indexprotected static int calcSegmentIndex(int iSlot)
iSlot
- the slot indexprotected static int calcFirstSlotIndex(int iSegment)
iSegment
- the segment index