introduce bitloops
This commit is contained in:
@@ -704,64 +704,7 @@ public final class Masker {
|
||||
return (bitCount(matchLo & MASK_LO) + bitCount(matchHi & MASK_HI)) / SIZED;
|
||||
}
|
||||
public Grid toGrid() { return new Grid(new byte[SwedishGenerator.SIZE], lo, hi); }
|
||||
public boolean isValid(int minLen) {
|
||||
return findOffendingClue(minLen, new long[SwedishGenerator.SIZE], new long[SwedishGenerator.SIZE]) == -1;
|
||||
}
|
||||
public boolean isValid(int minLen, long[] slo, long[] shi) {
|
||||
return findOffendingClue(minLen, slo, shi) == -1;
|
||||
}
|
||||
public int findOffendingClue(int minLen, long[] slo, long[] shi) {
|
||||
if (((xlo & rlo) & lo) != X) return numberOfTrailingZeros((xlo & rlo) & lo);
|
||||
if (((xhi & rhi) & hi) != X) return 64 | numberOfTrailingZeros((xhi & rhi) & hi);
|
||||
int n = 0;
|
||||
for (long bits = lo; bits != X; bits &= bits - 1) {
|
||||
int idx = numberOfTrailingZeros(bits);
|
||||
int dir = getDir(idx);
|
||||
int key = Slot.packSlotKey(idx, dir);
|
||||
long sLo = PATH_LO[key], sHi = PATH_HI[key];
|
||||
long hLo = sLo & lo, hHi = sHi & hi;
|
||||
if (Slotinfo.increasing(key)) {
|
||||
if (hLo != X) {
|
||||
sLo &= (1L << numberOfTrailingZeros(hLo)) - 1;
|
||||
sHi = 0;
|
||||
} else if (hHi != X) { sHi &= (1L << numberOfTrailingZeros(hHi)) - 1; }
|
||||
} else {
|
||||
if (hHi != X) {
|
||||
sHi &= -(1L << (63 - numberOfLeadingZeros(hHi)) << 1);
|
||||
sLo = 0;
|
||||
} else if (hLo != X) { sLo &= -(1L << (63 - numberOfLeadingZeros(hLo)) << 1); }
|
||||
}
|
||||
if (bitCount(sLo) + bitCount(sHi) < minLen) return idx;
|
||||
for (int i = 0; i < n; i++) if (bitCount(sLo & slo[i]) + bitCount(sHi & shi[i]) > 1) return idx;
|
||||
slo[n] = sLo;
|
||||
shi[n] = sHi;
|
||||
n++;
|
||||
}
|
||||
for (long bits = hi; bits != X; bits &= bits - 1) {
|
||||
int idx = 64 | numberOfTrailingZeros(bits);
|
||||
int dir = getDir(idx);
|
||||
int key = Slot.packSlotKey(idx, dir);
|
||||
long sLo = PATH_LO[key], sHi = PATH_HI[key];
|
||||
long hLo = sLo & lo, hHi = sHi & hi;
|
||||
if (Slotinfo.increasing(key)) {
|
||||
if (hLo != X) {
|
||||
sLo &= (1L << numberOfTrailingZeros(hLo)) - 1;
|
||||
sHi = 0;
|
||||
} else if (hHi != X) { sHi &= (1L << numberOfTrailingZeros(hHi)) - 1; }
|
||||
} else {
|
||||
if (hHi != X) {
|
||||
sHi &= -(1L << (63 - numberOfLeadingZeros(hHi)) << 1);
|
||||
sLo = 0;
|
||||
} else if (hLo != X) { sLo &= -(1L << (63 - numberOfLeadingZeros(hLo)) << 1); }
|
||||
}
|
||||
if (bitCount(sLo) + bitCount(sHi) < minLen) return idx;
|
||||
for (int i = 0; i < n; i++) if (bitCount(sLo & slo[i]) + bitCount(sHi & shi[i]) > 1) return idx;
|
||||
slo[n] = sLo;
|
||||
shi[n] = sHi;
|
||||
n++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public void forEachSlot(SlotVisitor visitor) {
|
||||
for (var l = lo & ~xlo & ~rlo & vlo; l != X; l &= l - 1) processSlot(this, visitor, Slot.packSlotKey(numberOfTrailingZeros(l), 1));
|
||||
for (var l = lo & ~xlo & ~rlo & ~vlo; l != X; l &= l - 1) processSlot(this, visitor, Slot.packSlotKey(numberOfTrailingZeros(l), 0));
|
||||
|
||||
Reference in New Issue
Block a user