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();