package com.fasterxml.aalto.in;
Specialized implementation of PName: can be used for medium-sized Strings
that consists of at most 9-12 bytes. These are less frequent than
shorter variations, but still somewhat common.
The reason for such specialized classes is mostly space efficiency;
and to a lesser degree performance. Both are achieved for short
Strings by avoiding another level of indirection (via quad arrays)
/**
* Specialized implementation of PName: can be used for medium-sized Strings
* that consists of at most 9-12 bytes. These are less frequent than
* shorter variations, but still somewhat common.
*<p>
* The reason for such specialized classes is mostly space efficiency;
* and to a lesser degree performance. Both are achieved for short
* Strings by avoiding another level of indirection (via quad arrays)
*/
public final class PName3
extends ByteBasedPName
{
final int mQuad1;
final int mQuad2;
final int mQuad3;
PName3(String pname, String prefix, String ln, int hash, int[] quads)
{
super(pname, prefix, ln, hash);
mQuad1 = quads[0];
mQuad2 = quads[1];
mQuad3 = quads[2];
}
public PName3(String pname, String prefix, String ln, int hash, int q1, int q2, int q3)
{
super(pname, prefix, ln, hash);
mQuad1 = q1;
mQuad2 = q2;
mQuad3 = q3;
}
@Override
public PName createBoundName(NsBinding nsb)
{
PName3 newName = new PName3(_prefixedName, _prefix, _localName, mHash,
mQuad1, mQuad2, mQuad3);
newName._namespaceBinding = nsb;
return newName;
}
@Override
public boolean equals(int quad1, int quad2) {
// Implies quad length < 3, never matches
return false;
}
@Override
public boolean equals(int[] quads, int qlen)
{
return (qlen == 3)
&& (quads[0] == mQuad1)
&& (quads[1] == mQuad2)
&& (quads[2] == mQuad3);
}
@Override
public boolean hashEquals(int h, int quad1, int quad2) {
// Implies quad length < 3, never matches
return false;
}
@Override
public boolean hashEquals(int h, int[] quads, int qlen) {
return (h == mHash) && (qlen == 3)
&& (quads[0] == mQuad1)
&& (quads[1] == mQuad2)
&& (quads[2] == mQuad3);
}
@Override
public int getFirstQuad() {
return mQuad1;
}
@Override
public int getLastQuad() {
return mQuad3;
}
@Override
public int getQuad(int index)
{
if (index < 2) {
return (index == 0) ? mQuad1 : mQuad2;
}
// Whatever would be returned for invalid index is arbitrary, so:
return mQuad3;
}
@Override
public int sizeInQuads() { return 3; }
}