/* Woodstox Lite ("wool") XML processor
 *
 * Copyright (c) 2006- Tatu Saloranta, tatu.saloranta@iki.fi
 *
 * Licensed under the License specified in the file LICENSE which is
 * included with the source code.
 * You may not use this file except in compliance with the License.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.fasterxml.aalto.in;

General implementation of PName to be used with longer names (ones that consist of more than 8 bytes).

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)

/** * General implementation of PName to be used with longer names (ones * that consist of more than 8 bytes). *<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 PNameN extends ByteBasedPName { final int[] mQuads; final int mQuadLen; PNameN(String pname, String prefix, String ln, int hash, int[] quads, int quadLen) { super(pname, prefix, ln, hash); mQuads = quads; mQuadLen = quadLen; } @Override public PName createBoundName(NsBinding nsb) { PNameN newName = new PNameN(_prefixedName, _prefix, _localName, mHash, mQuads, mQuadLen); newName._namespaceBinding = nsb; return newName; } @Override public boolean equals(int quad1, int quad2) { // Unlikely to match... but: if (mQuadLen < 3) { if (mQuadLen == 1) { return (mQuads[0] == quad1) && (quad2 == 0); } return (mQuads[0] == quad1) && (mQuads[1] == quad2); } return false; } @Override public boolean equals(int[] quads, int qlen) { if (qlen == mQuadLen) { for (int i = 0; i < qlen; ++i) { if (quads[i] != mQuads[i]) { return false; } } return true; } return false; } @Override public boolean hashEquals(int h, int quad1, int quad2) { if ((h == mHash) && (mQuadLen < 3)) { if (mQuadLen == 1) { return (mQuads[0] == quad1) && (quad2 == 0); } return (mQuads[0] == quad1) && (mQuads[1] == quad2); } return false; } @Override public boolean hashEquals(int h, int[] quads, int qlen) { if ((h == mHash) && (qlen == mQuadLen)) { for (int i = 0; i < qlen; ++i) { if (quads[i] != mQuads[i]) { return false; } } return true; } return false; } @Override public int getFirstQuad() { return mQuads[0]; } @Override public int getLastQuad() { return mQuads[mQuadLen-1]; } @Override public int getQuad(int index) { return (index < mQuadLen) ? mQuads[index] : 0; } @Override public int sizeInQuads() { return mQuadLen; } /* // for debugging public String toString() { StringBuilder sb = new StringBuilder(); sb.append('['); for (int i = 0; i < mQuadLen; ++i) { if (i > 0) { sb.append(','); } sb.append("0x"); sb.append(Integer.toHexString(mQuads[i])); } sb.append(']'); return sb.toString(); } */ }