1 package com.cliffc.aa.type;
 
    6 import org.jetbrains.annotations.NotNull;
 
    8 import java.util.Arrays;
 
    9 import java.util.Iterator;
 
   75   public abstract B 
ALL();
 
   76   public abstract B 
ANY();
 
   84     if( 
_bits != 
null ) 
for( 
long l : 
_bits ) sum += l;
 
   85     _hash = (int)((sum>>32)+sum);
 
   90     if( 
_bits==
null ) 
return true;  
 
   91     if( 
_con != 1 && 
_con != -1 ) 
return false;
 
   92     if( 
_bits.length==0 ) 
return false;  
 
   93     if( 
_bits.length==1 && 
_bits[0]== 0 ) 
return false; 
 
   95     if( 
_bits.length==1 && 
_bits[0]==1 ) 
return true; 
 
   99       while( (i = 
tree.parent(i)) != 0 )
 
  106     int len = 
bits.length;
 
  107     long b = 
bits[len-1];             
 
  108     if( (b & (b-1))!=0 ) 
return true; 
 
  110     for( 
int i=0; i<len-1; i++ ) 
if( 
bits[i] != 0 ) 
return true;
 
  114     if( 
_bits==
null ) 
return _con==0 ? 0 : 1;
 
  116     for( 
long b : 
_bits )
 
  117       sum += Long.bitCount(b);
 
  121   @Override 
public boolean equals( Object o ) {
 
  122     if( 
this==o ) 
return true;
 
  123     if( !(o instanceof 
Bits) ) 
return false;
 
  127     if( 
_bits ==
null || bs.
_bits==
null ) 
return false;
 
  128     if( 
_bits.length != bs.
_bits.length ) 
return false;
 
  129     for( 
int i=0; i<
_bits.length; i++ )
 
  136       if( 
_con== 0 ) 
return sb.
p(
"[]"); 
 
  137       if( 
_con== 1 ) 
return sb.
p(
"[ALL]");
 
  138       if( 
_con==-1 ) 
return sb.
p(
"[ANY]");
 
  139       return sb.
p(
'[').
p(
_con).
p(
']');
 
  148     for( Integer 
idx : 
this ) sb.
p(
idx).
p(sep);
 
  158     for( 
int i=0; i<
bits.length; i++ ) { 
 
  161         for( 
int j=0; j<64; j++ ) 
 
  162           if( (
mask(j)&l) != 0 ) {
 
  164             while( (par = 
tree.parent(par)) != 0 ) 
 
  172     int len = 
bits.length;
 
  173     while( len > 1 && 
bits[len-1]==0 ) len--;
 
  174     if( 
bits.length != len ) 
bits = Arrays.copyOf(
bits,len);
 
  183     int bnum0 = 63 - Long.numberOfLeadingZeros(
bits[len-1]);
 
  184     int bnum = bnum0 + ((len-1)<<6);
 
  185     if( any ) bnum = -bnum;
 
  195     for( 
int bit : 
bits ) 
or(ls,bit);
 
  196     return make(
false,ls);
 
  199   private static int  idx (
long i) { 
return (
int)(i>>6); }
 
  200   private static long mask(
long i) { 
return 1L<<(i&63); }
 
  211   @SuppressWarnings(
"unchecked")
 
  214     if( 
test(0) ) 
return (B)
this;
 
  218     else bs = 
_bits.clone();    
 
  220     return make(
false,bs);      
 
  227     if( 
_bits==
null ) 
return i!=0 && i==Math.abs(
_con);
 
  233     if( 
test(i) ) 
return true;
 
  235     while( (i = 
tree.parent(i)) != 0 )
 
  245   @SuppressWarnings(
"unchecked")
 
  249     long[] bs = 
_bits.clone();           
 
  251     return make(
true,bs);                
 
  254   @SuppressWarnings(
"unchecked")
 
  256     if( !
test(bit) ) 
return (B)
this;
 
  258     long[] bs = 
_bits.clone();
 
  263   @SuppressWarnings(
"unchecked")
 
  265     if( 
test(bit) ) 
return (B)
this;
 
  267     if( 
this == 
EMPTY() ) 
return b;
 
  272   @SuppressWarnings(
"unchecked")
 
  274     if( 
_bits == 
null ) 
return (B)
this; 
 
  275     if( (
_bits[0] &1)==0 ) 
return (B) 
this; 
 
  276     long[] bs = 
_bits.clone();
 
  283   private static long[] 
bits( 
int b ) { 
return new long[
idx(b)+1]; }
 
  285     return _bits==
null ? Math.abs(
_con) : (63 - Long.numberOfLeadingZeros(
_bits[
_bits.length-1]))+((
_bits.length-1)<<6);
 
  297   @SuppressWarnings(
"unchecked")
 
  299     if( 
this==bs ) 
return (B)
this;
 
  301     if( 
this==full || bs==full ) 
return full;
 
  303     if( 
this==any ) 
return bs;
 
  304     if( bs  ==any ) 
return (B)
this;
 
  308     if( 
is_empty() ) 
return bs.above_center() ? (B)
this : bs;
 
  309     if( bs.is_empty() ) 
return above_center() ? bs : (B)
this;
 
  311     long[] bits0 = 
_bits, bits1 = bs._bits;
 
  312     int con0 = Math.abs(
_con), con1 = Math.abs(bs._con);
 
  315     if( bits0==
null ) 
or(bits0=
bits(con0), con0);
 
  316     if( bits1==
null ) 
or(bits1=
bits(con1), con1);
 
  317     con0 =    
_con < 0 ? -1 : 1;
 
  318     con1 = bs._con < 0 ? -1 : 1;
 
  321     if( bits0.length < bits1.length ) { 
long[] tmp=bits0; bits0=bits1; bits1=tmp; 
int t=con0; con0=con1; con1=t; }
 
  323     if( con0 == 1 && con1 == 1 ) {
 
  324       long[] 
bits = bits0.clone();        
 
  325       for( 
int i=0; i<bits1.length; i++ ) 
 
  332     if( con0 == -1 && con1 == -1 ) {
 
  333       long[] 
bits = 
new long[bits0.length];
 
  337       if( (bits0[0]&1)==1 && (bits1[0]&1)==1 )  
bits[0]|=1;
 
  349   private static void join( Tree 
tree, 
long[] bits0, 
long[] bits1, 
long[] bits2 ) {
 
  351     for( 
int i=0; i<bits0.length; i++ ) { 
 
  356         for( 
int j=0; j<64; j++ ) 
 
  357           if( (
mask(j)&l) != 0 ) {
 
  358             for( 
int par = (i<<6)+j; par!=0; par = 
tree.parent(par) ) 
 
  359               if( 
test(bits1,par) )                
 
  360                 { bits2[i]|=
mask(j); 
break; }      
 
  367   @SuppressWarnings(
"unchecked")
 
  372   public boolean isa(B bs) { 
return meet(bs) == bs; }
 
  376     for( 
int alias : 
this )
 
  377       for( 
int kid=alias; kid!=0; kid = 
tree().next_kid(alias,kid) )
 
  379           bs0 = bs0.
clear(kid);
 
  383     for( 
int alias : 
this )
 
  384       for( 
int kid=alias; kid!=0; kid = 
tree().next_kid(alias,kid) )
 
  393     for( 
int alias : 
this )
 
  415       for( ; par <= kid; kid = 
parent(kid) )
 
  416         if( par==kid ) 
return true;
 
  425         for( 
int j=1; j<
_kids[i][0]; j++ )
 
  435       if( par < 
_kids.length ) { 
 
  436         int[] kids = 
_kids[par]; 
 
  439           if( klen < kids.length ) { 
 
  440             int bit = kids[klen];
 
  442               assert 
_pars[bit] == par; 
 
  454       assert 
_pars[bit]==0;
 
  458       int[] kids = 
_kids[par];  
 
  459       if( kids==
null ) 
_kids[par] = kids = 
new int[]{1};
 
  461       if( klen == kids.length ) 
 
  462         _kids[par] = kids = Arrays.copyOf(kids,klen<<1);
 
  471       for( 
int i=0; i<
_kids.length; i++ )
 
  476       for( 
int i=0; i<
_kids.length; i++ )
 
  477         if( 
_kids[i] != 
null )
 
  493       for( 
int kid=1; kid<nkids; kid++ )
 
  501       if( kid==0 ) 
return 0;
 
  503       if( kid==alias && !is_par ) 
return 0; 
 
  506         return _kids[kid][1];   
 
  509           int par = 
_pars[kid];    
 
  510           int[] kids = 
_kids[par]; 
 
  511           for( 
int i=1; i<kids[0]-1; i++ )
 
  523   @NotNull @Override 
public Iterator<Integer> 
iterator() { 
return new Iter(); }
 
  524   private class Iter implements Iterator<Integer> {
 
  528         if( 
_i==-1 ) { 
_i=0; 
return true; } 
else return false;
 
  535     @Override 
public Integer 
next() {
 
  538       throw new java.util.NoSuchElementException();