introduce bitloops
This commit is contained in:
@@ -285,12 +285,36 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
|
|||||||
static int offset(int r, int c) { return r | (c << 3); }
|
static int offset(int r, int c) { return r | (c << 3); }
|
||||||
/// the pos will never target a clue
|
/// the pos will never target a clue
|
||||||
public byte letter32At(int pos) { return g[pos]; }
|
public byte letter32At(int pos) { return g[pos]; }
|
||||||
void setLetter(int idx, byte ch) { g[idx] = ch; }
|
void setLetterLo(int idx, byte ch) {
|
||||||
|
lo &= ~(1L << idx);
|
||||||
|
|
||||||
private void clearletter(int idx) { g[idx] = DASH; }
|
g[idx] = ch;
|
||||||
|
}
|
||||||
|
void setLetterHi(int idx, byte ch) {
|
||||||
|
hi &= ~(1L << idx & 63);
|
||||||
|
|
||||||
|
g[idx] = ch;
|
||||||
|
}
|
||||||
|
void setLetter(int idx, byte ch) {
|
||||||
|
if ((idx & 64)==0)
|
||||||
|
setLetterLo(idx, ch);
|
||||||
|
else
|
||||||
|
setLetterHi(idx, ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearletterLo(int idx) {
|
||||||
|
g[idx] = DASH;
|
||||||
|
|
||||||
|
lo |= (1L << idx);
|
||||||
|
}
|
||||||
|
private void clearletterHi(int idx) {
|
||||||
|
g[idx] = DASH;
|
||||||
|
|
||||||
|
hi |= (1L << idx & 63);
|
||||||
|
}
|
||||||
void undoPlace(long maskLo, long maskHi) {
|
void undoPlace(long maskLo, long maskHi) {
|
||||||
for (long b = maskLo; b != 0; b &= b - 1) clearletter(Long.numberOfTrailingZeros(b));
|
for (long b = maskLo; b != 0; b &= b - 1) clearletterLo(Long.numberOfTrailingZeros(b));
|
||||||
for (long b = maskHi; b != 0; b &= b - 1) clearletter(64 | Long.numberOfTrailingZeros(b));
|
for (long b = maskHi; b != 0; b &= b - 1) clearletterHi(64 | Long.numberOfTrailingZeros(b));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,24 +747,24 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static long patternForSlot(Grid grid, Slot s) {
|
static long patternForSlot(Grid grid, Slot s) {
|
||||||
/*if ((s.lo & ~grid.lo) == 0 && (s.hi & ~grid.hi) == 0) {
|
if ((s.lo & ~grid.lo) == 0 && (s.hi & ~grid.hi) == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}*/
|
}
|
||||||
long p = 0;
|
long p = 0;
|
||||||
if (s.increasing()) {
|
if (s.increasing()) {
|
||||||
for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) {
|
for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) {
|
||||||
int idx = Long.numberOfTrailingZeros(b);
|
int idx = Long.numberOfTrailingZeros(b);
|
||||||
int val = grid.g[idx];
|
byte val = grid.g[idx];
|
||||||
if (val != 0) {
|
if (val != DASH) {
|
||||||
int i = Long.bitCount(s.lo & ((1L << idx) - 1));
|
int i = Long.bitCount(s.lo & ((1L << idx) - 1));
|
||||||
p |= ((long) (i * 26 + val)) << (i << 3);
|
p |= ((long) (i * 26 + val)) << (i << 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int offset = Long.bitCount(s.lo);
|
int offset = Long.bitCount(s.lo);
|
||||||
for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) {
|
for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) {
|
||||||
int idx = Long.numberOfTrailingZeros(b);
|
int idx = Long.numberOfTrailingZeros(b);
|
||||||
int val = grid.g[64 | idx];
|
byte val = grid.g[64 | idx];
|
||||||
if (val != 0) {
|
if (val != DASH) {
|
||||||
int i = offset + Long.bitCount(s.hi & ((1L << idx) - 1));
|
int i = offset + Long.bitCount(s.hi & ((1L << idx) - 1));
|
||||||
p |= ((long) (i * 26 + val)) << (i << 3);
|
p |= ((long) (i * 26 + val)) << (i << 3);
|
||||||
}
|
}
|
||||||
@@ -748,17 +772,17 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
|
|||||||
} else {
|
} else {
|
||||||
int offset = Long.bitCount(s.hi);
|
int offset = Long.bitCount(s.hi);
|
||||||
for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) {
|
for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) {
|
||||||
int idx = Long.numberOfTrailingZeros(b);
|
int idx = Long.numberOfTrailingZeros(b);
|
||||||
int val = grid.g[64 | idx];
|
byte val = grid.g[64 | idx];
|
||||||
if (val != 0) {
|
if (val != DASH) {
|
||||||
int i = Long.bitCount(s.hi & ~((1L << idx) | ((1L << idx) - 1)));
|
int i = Long.bitCount(s.hi & ~((1L << idx) | ((1L << idx) - 1)));
|
||||||
p |= ((long) (i * 26 + val)) << (i << 3);
|
p |= ((long) (i * 26 + val)) << (i << 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) {
|
for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) {
|
||||||
int idx = Long.numberOfTrailingZeros(b);
|
int idx = Long.numberOfTrailingZeros(b);
|
||||||
int val = grid.g[idx];
|
byte val = grid.g[idx];
|
||||||
if (val != 0) {
|
if (val != DASH) {
|
||||||
int i = offset + Long.bitCount(s.lo & ~((1L << idx) | ((1L << idx) - 1)));
|
int i = offset + Long.bitCount(s.lo & ~((1L << idx) | ((1L << idx) - 1)));
|
||||||
p |= ((long) (i * 26 + val)) << (i << 3);
|
p |= ((long) (i * 26 + val)) << (i << 3);
|
||||||
}
|
}
|
||||||
@@ -781,7 +805,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
|
|||||||
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
||||||
if (cur == DASH) {
|
if (cur == DASH) {
|
||||||
maskLo |= (1L << idx);
|
maskLo |= (1L << idx);
|
||||||
grid.setLetter(idx, ch);
|
grid.setLetterLo(idx, ch);
|
||||||
} else if (cur != ch) {
|
} else if (cur != ch) {
|
||||||
grid.undoPlace(maskLo, maskHi);
|
grid.undoPlace(maskLo, maskHi);
|
||||||
return false;
|
return false;
|
||||||
@@ -792,7 +816,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
|
|||||||
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
||||||
if (cur == DASH) {
|
if (cur == DASH) {
|
||||||
maskHi |= (1L << (idx & 63));
|
maskHi |= (1L << (idx & 63));
|
||||||
grid.setLetter(idx, ch);
|
grid.setLetterHi(idx, ch);
|
||||||
} else if (cur != ch) {
|
} else if (cur != ch) {
|
||||||
grid.undoPlace(maskLo, maskHi);
|
grid.undoPlace(maskLo, maskHi);
|
||||||
return false;
|
return false;
|
||||||
@@ -805,7 +829,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
|
|||||||
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
||||||
if (cur == DASH) {
|
if (cur == DASH) {
|
||||||
maskHi |= (1L << msb);
|
maskHi |= (1L << msb);
|
||||||
grid.setLetter(idx, ch);
|
grid.setLetterHi(idx, ch);
|
||||||
} else if (cur != ch) {
|
} else if (cur != ch) {
|
||||||
grid.undoPlace(maskLo, maskHi);
|
grid.undoPlace(maskLo, maskHi);
|
||||||
return false;
|
return false;
|
||||||
@@ -818,7 +842,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
|
|||||||
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i);
|
||||||
if (cur == DASH) {
|
if (cur == DASH) {
|
||||||
maskLo |= (1L << msb);
|
maskLo |= (1L << msb);
|
||||||
grid.setLetter(idx, ch);
|
grid.setLetterLo(idx, ch);
|
||||||
} else if (cur != ch) {
|
} else if (cur != ch) {
|
||||||
grid.undoPlace(maskLo, maskHi);
|
grid.undoPlace(maskLo, maskHi);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user