/* 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;

/**
 * Specialized implementation of PName: can be used for short Strings
 * that consists of at most 8 bytes. In general this means ascii-only
 * names (but possibly qualified by a short prefix)
 *<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 PName2
    extends ByteBasedPName
{
    final int mQuad1;
    final int mQuad2;

    public PName2(String pname, String prefix, String ln, int hash,
           int quad1, int quad2)
    {
        super(pname, prefix, ln, hash);
        mQuad1 = quad1;
        mQuad2 = quad2;
    }

    @Override
    public PName createBoundName(NsBinding nsb)
    {
        PName2 newName = new PName2(_prefixedName, _prefix, _localName, mHash,
                                    mQuad1, mQuad2);
        newName._namespaceBinding = nsb;
        return newName;
    }

    @Override
    public boolean equals(int quad1, int quad2) {
        return (quad1 == mQuad1) && (quad2 == mQuad2);
    }

    @Override
    public boolean equals(int[] quads, int qlen) {
        return (qlen == 2)
            && (quads[0] == mQuad1) && (quads[1] == mQuad2);
    }

    @Override
    public boolean hashEquals(int h, int quad1, int quad2) {
        return (h == mHash) && (quad1 == mQuad1) && (quad2 == mQuad2);
    }

    @Override
    public boolean hashEquals(int h, int[] quads, int qlen) {
        return  (h == mHash) && (qlen == 2)
                && (quads[0] == mQuad1) && (quads[1] == mQuad2);
    }
    
    @Override
    public int getFirstQuad() {
        return mQuad1;
    }

    @Override
    public int getLastQuad() {
        return mQuad2;
    }

    @Override
    public int getQuad(int index) {
        return (index == 0) ? mQuad1 :mQuad2;
    }

    @Override
    public int sizeInQuads() { return 2; }
}
