package com.ctc.wstx.dtd;

import com.ctc.wstx.util.PrefixedName;

PrefixedNameSet implementation suitable for storing small set of PrefixedName values (generally 8 or less). Uses linear search, and is thus the most compact presentation for a set

Notes about usage:

  • All Strings contained in PrefixedName instances are assumed interned, so that equality comparison can be done (both for values stored and keys used)
  • It is assumed that sets are never empty, ie. always contain at least one entry.
  • It is assumed that caller has ensured that there are no duplicates in the set -- this data structure does no further validation.
/** * PrefixedNameSet implementation suitable for storing small set of PrefixedName * values (generally 8 or less). Uses linear search, and is thus the * most compact presentation for a set *<p> * Notes about usage: * <ul> * <li>All Strings contained in {@link PrefixedName} instances are assumed * interned, so that equality comparison can be done (both for values * stored and keys used) * </li> * <li>It is assumed that sets are never empty, ie. always contain at * least one entry. * </li> * <li>It is assumed that caller has ensured that there are no duplicates * in the set -- this data structure does no further validation. * </li> * </ul> */
public final class SmallPrefixedNameSet extends PrefixedNameSet { final boolean mNsAware; final String[] mStrings; public SmallPrefixedNameSet(boolean nsAware, PrefixedName[] names) { mNsAware = nsAware; int len = names.length; if (len == 0) { // sanity check throw new IllegalStateException("Trying to construct empty PrefixedNameSet"); } mStrings = new String[nsAware ? (len+len) : len]; for (int out = 0, in = 0; in < len; ++in) { PrefixedName nk = names[in]; if (nsAware) { mStrings[out++] = nk.getPrefix(); } mStrings[out++] = nk.getLocalName(); } } @Override public boolean hasMultiple() { return mStrings.length > 1; }
Returns:True if the set contains specified name; false if not.
/** * @return True if the set contains specified name; false if not. */
@Override public boolean contains(PrefixedName name) { int len = mStrings.length; String ln = name.getLocalName(); String[] strs = mStrings; if (mNsAware) { String prefix = name.getPrefix(); if (strs[1] == ln && strs[0] == prefix) { return true; } for (int i = 2; i < len; i += 2) { if (strs[i+1] == ln && strs[i] == prefix) { return true; } } } else { if (strs[0] == ln) { return true; } for (int i = 1; i < len; ++i) { if (strs[i] == ln) { return true; } } } return false; } @Override public void appendNames(StringBuilder sb, String sep) { for (int i = 0; i < mStrings.length; ) { if (i > 0) { sb.append(sep); } if (mNsAware) { String prefix = mStrings[i++]; if (prefix != null) { sb.append(prefix); sb.append(':'); } } sb.append(mStrings[i++]); } } }