public final class ByteBasedPNameTable extends NameTable
PNames
, specifically, instances of (ByteBasedPName
).Modifier and Type | Class and Description |
---|---|
(package private) static class |
ByteBasedPNameTable.Bucket |
Modifier and Type | Field and Description |
---|---|
(package private) static int |
INITIAL_COLLISION_LEN |
(package private) static int |
LAST_VALID_BUCKET
Bucket index is 8 bits, and value 0 is reserved to represent
'empty' status.
|
private int |
mCollCount
Total number of PNames in collision buckets (included in
mCount along with primary entries) |
private int |
mCollEnd
Index of the first unused collision bucket entry (== size of
the used portion of collision list): less than
or equal to 0xFF (255), since max number of entries is 255
(8-bit, minus 0 used as 'empty' marker)
|
private ByteBasedPNameTable.Bucket[] |
mCollList
Array of heads of collision bucket chains; size dynamically
|
private boolean |
mCollListShared
Flag that indicates whether underlying data structures for
the collision list are shared or not.
|
private int |
mCount
Total number of PNames in the symbol table
|
(package private) static int |
MIN_HASH_SIZE |
private int[] |
mMainHash
Array of 2^N size, which contains combination
of 24-bits of hash (0 to indicate 'empty' slot),
and 8-bit collision bucket index (0 to indicate empty
collision bucket chain; otherwise subtract one from index)
|
private int |
mMainHashMask
Mask used to truncate 32-bit hash value to current hash array
size; essentially, hash array size - 1 (since hash array sizes
are 2^N).
|
private boolean |
mMainHashShared
Flag that indicates whether underlying data structures for
the main hash area are shared or not.
|
private ByteBasedPName[] |
mMainNames
Array that contains
PName instances matching
entries in mMainHash . |
private boolean |
mMainNamesShared |
private boolean |
mNeedRehash
This flag is set if, after adding a new entry, it is deemed
that a rehash is warranted if any more entries are to be added.
|
Constructor and Description |
---|
ByteBasedPNameTable(ByteBasedPNameTable parent)
Constructor used when creating a child instance
|
ByteBasedPNameTable(int hashSize) |
Modifier and Type | Method and Description |
---|---|
ByteBasedPName |
addSymbol(int hash,
java.lang.String symbolStr,
int colonIx,
int[] quads,
int qlen) |
ByteBasedPName |
addSymbol(int hash,
java.lang.String symbolStr,
int colonIx,
int firstQuad,
int secondQuad) |
static int |
calcHash(int firstQuad) |
static int |
calcHash(int[] quads,
int qlen) |
static int |
calcHash(int firstQuad,
int secondQuad) |
static int[] |
calcQuads(byte[] wordBytes) |
private void |
doAddSymbol(int hash,
ByteBasedPName symbol) |
private void |
expandCollision() |
private int |
findBestBucket()
Method called to find the best bucket to spill a PName over to:
usually the first bucket that has only one entry, but in general
first one of the buckets with least number of entries
|
ByteBasedPName |
findSymbol(int hash,
int[] quads,
int qlen)
Finds and returns name matching the specified symbol, if such
name already exists in the table; or if not, creates name object,
adds to the table, and returns it.
|
ByteBasedPName |
findSymbol(int hash,
int firstQuad,
int secondQuad)
Finds and returns name matching the specified symbol, if such
name already exists in the table; or if not, creates name object,
adds to the table, and returns it.
|
void |
markAsShared() |
boolean |
maybeDirty()
Method called to check to quickly see if a child symbol table
may have gotten additional entries.
|
boolean |
mergeFromChild(ByteBasedPNameTable child) |
void |
nuke()
Method used by test code, to reset state of the name table.
|
private void |
rehash() |
int |
size() |
java.lang.String |
toDebugString() |
java.lang.String |
toString() |
private void |
unshareCollision() |
private void |
unshareMain()
Method that needs to be called, if the main hash structure
is (may be) shared.
|
private void |
unshareNames() |
static final int MIN_HASH_SIZE
static final int INITIAL_COLLISION_LEN
static final int LAST_VALID_BUCKET
private int mCount
private int mMainHashMask
private int[] mMainHash
private ByteBasedPName[] mMainNames
PName
instances matching
entries in mMainHash
. Contains nulls for unused
entries.private ByteBasedPNameTable.Bucket[] mCollList
private int mCollCount
mCount
along with primary entries)private int mCollEnd
private transient boolean mNeedRehash
private boolean mMainHashShared
This flag needs to be checked both when adding new main entries, and when adding new collision list queues (i.e. creating a new collision list head entry)
private boolean mMainNamesShared
private boolean mCollListShared
This flag needs to be checked when adding new collision entries.
public ByteBasedPNameTable(int hashSize)
ByteBasedPNameTable(ByteBasedPNameTable parent)
public boolean mergeFromChild(ByteBasedPNameTable child)
public void markAsShared()
public void nuke()
public boolean maybeDirty()
maybeDirty
in class NameTable
public ByteBasedPName findSymbol(int hash, int firstQuad, int secondQuad)
Note: separate methods to optimize common case of relatively short element/attribute names (8 or less ascii characters)
firstQuad
- int32 containing first 4 bytes of the pname;
if the whole name less than 4 bytes, padded with zero bytes
in front (zero MSBs, ie. right aligned)secondQuad
- int32 containing bytes 5 through 8 of the
pname; if less than 8 bytes, padded with up to 4 zero bytes
in front (zero MSBs, ie. right aligned)public ByteBasedPName findSymbol(int hash, int[] quads, int qlen)
Note: this is the general purpose method that can be called for names of any length. However, if name is less than 9 bytes long, it is preferable to call the version optimized for short names.
quads
- Array of int32s, each of which contain 4 bytes of
encoded nameqlen
- Number of int32s, starting from index 0, in quads
parameterpublic ByteBasedPName addSymbol(int hash, java.lang.String symbolStr, int colonIx, int firstQuad, int secondQuad)
public ByteBasedPName addSymbol(int hash, java.lang.String symbolStr, int colonIx, int[] quads, int qlen)
public static final int calcHash(int firstQuad)
public static final int calcHash(int firstQuad, int secondQuad)
public static final int calcHash(int[] quads, int qlen)
public static int[] calcQuads(byte[] wordBytes)
public java.lang.String toString()
toString
in class java.lang.Object
public java.lang.String toDebugString()
private void doAddSymbol(int hash, ByteBasedPName symbol)
private void rehash()
private int findBestBucket()
private void unshareMain()
private void unshareCollision()
private void unshareNames()
private void expandCollision()