Top Description Inners Fields Constructors Methods
com.fasterxml.aalto.in

public final Class ByteBasedPNameTable

extends NameTable
Class Inheritance
Imports
com.fasterxml.aalto.util.NameTable

This is a symbol table implementation used for storing byte-based PNames, specifically, instances of (ByteBasedPName).

Nested and Inner Type Summary

Modifier and TypeClass and Description
pack-priv static class

Field Summary

Modifier and TypeField and Description
pack-priv static final int
pack-priv static final 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

pack-priv static final int
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
private transient 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 Summary

AccessConstructor and Description
public
ByteBasedPNameTable(int hashSize)

pack-priv
ByteBasedPNameTable(ByteBasedPNameTable parent)

Constructor used when creating a child instance

Method Summary

Modifier and TypeMethod and Description
public ByteBasedPName
addSymbol(int hash, String symbolStr, int colonIx, int firstQuad, int secondQuad)

public ByteBasedPName
addSymbol(int hash, 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)

private void
doAddSymbol(int hash, ByteBasedPName symbol)

private void
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

public ByteBasedPName

Returns:

PName matching the symbol passed (or constructed for it)
findSymbol
(int hash, int
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)
firstQuad
,
int
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)
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.

public ByteBasedPName

Returns:

PName matching the symbol passed (or constructed for it)
findSymbol
(int hash, int[]
Array of int32s, each of which contain 4 bytes of encoded name
quads
,
int
Number of int32s, starting from index 0, in quads parameter
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.

public void
public boolean
maybeDirty()

Implements abstract com.fasterxml.aalto.util.NameTable.maybeDirty.

Method called to check to quickly see if a child symbol table may have gotten additional entries.
public boolean
public void
nuke()

Method used by test code, to reset state of the name table.

private void
public int
public String
toString()

Overrides java.lang.Object.toString.

Returns a string representation of the object.
private void
private void
unshareMain()

Method that needs to be called, if the main hash structure is (may be) shared.

private void

Field Detail

INITIAL_COLLISION_LENback to summary
pack-priv static final int INITIAL_COLLISION_LEN
LAST_VALID_BUCKETback to summary
pack-priv static final int LAST_VALID_BUCKET

Bucket index is 8 bits, and value 0 is reserved to represent 'empty' status.

mCollCountback to summary
private int mCollCount

Total number of PNames in collision buckets (included in mCount along with primary entries)

mCollEndback to summary
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)

mCollListback to summary
private ByteBasedPNameTable.Bucket[] mCollList

Array of heads of collision bucket chains; size dynamically

mCollListSharedback to summary
private boolean mCollListShared

Flag that indicates whether underlying data structures for the collision list are shared or not. If they are, then they need to be handled in copy-on-write way, i.e. if they need to be modified, a copy needs to be made first; at this point it will not be shared any more, and can be modified.

This flag needs to be checked when adding new collision entries.

mCountback to summary
private int mCount

Total number of PNames in the symbol table

MIN_HASH_SIZEback to summary
pack-priv static final int MIN_HASH_SIZE
mMainHashback to summary
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)

mMainHashMaskback to summary
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).

mMainHashSharedback to summary
private boolean mMainHashShared

Flag that indicates whether underlying data structures for the main hash area are shared or not. If they are, then they need to be handled in copy-on-write way, i.e. if they need to be modified, a copy needs to be made first; at this point it will not be shared any more, and can be modified.

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)

mMainNamesback to summary
private ByteBasedPName[] mMainNames

Array that contains PName instances matching entries in mMainHash. Contains nulls for unused entries.

mMainNamesSharedback to summary
private boolean mMainNamesShared
mNeedRehashback to summary
private transient 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 Detail

ByteBasedPNameTableback to summary
public ByteBasedPNameTable(int hashSize)
ByteBasedPNameTableback to summary
pack-priv ByteBasedPNameTable(ByteBasedPNameTable parent)

Constructor used when creating a child instance

Method Detail

addSymbolback to summary
public ByteBasedPName addSymbol(int hash, String symbolStr, int colonIx, int firstQuad, int secondQuad)
addSymbolback to summary
public ByteBasedPName addSymbol(int hash, String symbolStr, int colonIx, int[] quads, int qlen)
calcHashback to summary
public static final int calcHash(int firstQuad)
calcHashback to summary
public static final int calcHash(int firstQuad, int secondQuad)
calcHashback to summary
public static final int calcHash(int[] quads, int qlen)
calcQuadsback to summary
public static int[] calcQuads(byte[] wordBytes)
doAddSymbolback to summary
private void doAddSymbol(int hash, ByteBasedPName symbol)
expandCollisionback to summary
private void expandCollision()
findBestBucketback to summary
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

findSymbolback to summary
public 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.

Note

separate methods to optimize common case of relatively short element/attribute names (8 or less ascii characters)

Parameters
firstQuad:int

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:int

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)

Returns:ByteBasedPName

PName matching the symbol passed (or constructed for it)

findSymbolback to summary
public 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.

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.

Parameters
quads:int[]

Array of int32s, each of which contain 4 bytes of encoded name

qlen:int

Number of int32s, starting from index 0, in quads parameter

Returns:ByteBasedPName

PName matching the symbol passed (or constructed for it)

markAsSharedback to summary
public void markAsShared()
maybeDirtyback to summary
public boolean maybeDirty()

Implements abstract com.fasterxml.aalto.util.NameTable.maybeDirty.

Method called to check to quickly see if a child symbol table may have gotten additional entries. Used for checking to see if a child table should be merged into shared table.

Annotations
@Override
mergeFromChildback to summary
public boolean mergeFromChild(ByteBasedPNameTable child)
nukeback to summary
public void nuke()

Method used by test code, to reset state of the name table.

rehashback to summary
private void rehash()
sizeback to summary
public int size()

Implements abstract com.fasterxml.aalto.util.NameTable.size.

Annotations
@Override
toStringback to summary
public String toString()

Overrides java.lang.Object.toString.

Doc from java.lang.Object.toString.

Returns a string representation of the object.

Returns:String

a string representation of the object.

Annotations
@Override
unshareCollisionback to summary
private void unshareCollision()
unshareMainback to summary
private void unshareMain()

Method that needs to be called, if the main hash structure is (may be) shared. This happens every time something is added, even if addition is to the collision list (since collision list index comes from lowest 8 bits of the primary hash entry)

unshareNamesback to summary
private void unshareNames()
com.fasterxml.aalto.in back to summary

pack-priv final Class ByteBasedPNameTable.Bucket

extends Object
Class Inheritance

Field Summary

Modifier and TypeField and Description
pack-priv final ByteBasedPName
pack-priv final ByteBasedPNameTable.Bucket

Constructor Summary

AccessConstructor and Description
pack-priv

Method Summary

Modifier and TypeMethod and Description
public ByteBasedPName
find(int hash, int firstQuad, int secondQuad)

public ByteBasedPName
find(int hash, int[] quads, int qlen)

public int
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

mNameback to summary
pack-priv final ByteBasedPName mName
mNextback to summary
pack-priv final ByteBasedPNameTable.Bucket mNext

Constructor Detail

Bucketback to summary
pack-priv Bucket(ByteBasedPName name, ByteBasedPNameTable.Bucket next)

Method Detail

findback to summary
public ByteBasedPName find(int hash, int firstQuad, int secondQuad)
findback to summary
public ByteBasedPName find(int hash, int[] quads, int qlen)
lengthback to summary
public int length()