package org.kohsuke.bali.automaton;
import org.kohsuke.bali.automaton.builder.NameClassEncoder;
import com.sun.msv.grammar.NameClass;
/**
* Signature of a name class.
*
* Checking whether a (uri,local) pair is accepted to a name class
* or not is a costly operation.
*
* Bali avoids the use of name classes at the runtime by replacing
* <code>NameClass.accepts(name)</code> by the following bit test:
* <code>(nameCode&mask)==test</code>
*
* @author Kohsuke Kawaguchi (kk@kohsuke.org)
*/
public final class NameSignature {
public NameSignature( NameClass nc, int mask, int test, NameClassEncoder encoder ) {
this.nameClass = nc;
this.mask=mask;
this.test=test;
this.owner = encoder;
}
/** NameClass object from which this signature is derived. */
public final NameClass nameClass;
/** Bit mask to be applied. */
public final int mask;
/** Test bits to be tested. */
public final int test;
/**
* NameClassEncoder object that created this signature.
* Used just for debugging purpose.
*/
private final NameClassEncoder owner;
public boolean accepts( int nameCode ) {
return (nameCode&mask)==test;
}
public String toString() {
String s="";
for( int i=0; i<owner.getUsedBits(); i++ )
if( (mask&(1<<i))!=0 ) {
if( (test&(1<<i))!=0 ) s='1'+s;
else s='0'+s;
} else
s='-'+s;
return s+" : "+nameClass;
}
}