introduce bitloops

This commit is contained in:
mike
2026-01-14 11:03:28 +01:00
parent 66bd8193ef
commit c1706e1bf7
5 changed files with 42 additions and 65 deletions

View File

@@ -78,9 +78,9 @@ public class SwedishGeneratorTest {
@Test
void testPatternForSlotAllLetters() {
var grid = createEmpty();
grid.setLetter(0, LETTER_A);
grid.setLetter(1, LETTER_B);
grid.setLetter(2, LETTER_C);
grid.setLetterLo(0, LETTER_A);
grid.setLetterLo(1, LETTER_B);
grid.setLetterLo(2, LETTER_C);
var slot = Slot.from(18 << Slot.BIT_FOR_DIR | (CLUE_RIGHT), 7L, 0L);
var pattern = patternForSlot(grid, slot);
@@ -90,8 +90,8 @@ public class SwedishGeneratorTest {
@Test
void testPatternForSlotMixed() {
var grid = createEmpty();
grid.setLetter(0, LETTER_A);
grid.setLetter(2, LETTER_C);
grid.setLetterLo(OFF_0_0, LETTER_A);
grid.setLetterLo(2, LETTER_C);
var slot = Slot.from(1 << Slot.BIT_FOR_DIR | (CLUE_RIGHT), 7L, 0L);
var pattern = patternForSlot(grid, slot);
@@ -110,7 +110,7 @@ public class SwedishGeneratorTest {
@Test
void testPatternForSlotSingleLetter() {
var grid = createEmpty();
grid.setLetter(0, LETTER_A);
grid.setLetterLo(OFF_0_0, LETTER_A);
var slot = Slot.from(1 << Slot.BIT_FOR_DIR | (CLUE_RIGHT), 7L, 0L);
var pattern = patternForSlot(grid, slot);
@@ -137,7 +137,7 @@ public class SwedishGeneratorTest {
@Test
void testGrid() {
var grid = createEmpty();
grid.setLetter(OFF_0_0, LETTER_A);
grid.setLetterLo(OFF_0_0, LETTER_A);
assertEquals(LETTER_A, grid.letter32At(OFF_0_0));
}
@@ -334,22 +334,19 @@ public class SwedishGeneratorTest {
var lo = (1L << OFF_0_0) | (1L << OFF_0_1) | (1L << OFF_0_2);
var s = Slot.from(key, lo, 0L);
var w1 = ABC;
var undoBuffer = new long[10];
// 1. Successful placement in empty grid
assertTrue(placeWord(grid, s, w1, undoBuffer, 0));
assertTrue(placeWord(grid, s, w1));
assertEquals(LETTER_A, grid.letter32At(OFF_0_0));
assertEquals(LETTER_B, grid.letter32At(OFF_0_1));
assertEquals(LETTER_C, grid.letter32At(OFF_0_2));
assertEquals(lo, undoBuffer[0]);
// 2. Successful placement with partial overlap (same characters)
assertTrue(placeWord(grid, s, w1, undoBuffer, 1));
assertEquals(0L, undoBuffer[2]); // 0 new characters placed
assertTrue(placeWord(grid, s, w1));
// 3. Conflict: place "ABD" where "ABC" is
var w2 = ABD;
assertFalse(placeWord(grid, s, w2, undoBuffer, 2));
assertFalse(placeWord(grid, s, w2));
// Verify grid is unchanged (still "ABC")
assertEquals(LETTER_A, grid.letter32At(OFF_0_0));
assertEquals(LETTER_B, grid.letter32At(OFF_0_1));
@@ -357,8 +354,8 @@ public class SwedishGeneratorTest {
// 4. Partial placement then conflict (rollback)
grid = createEmpty();
grid.setLetter(OFF_0_2, LETTER_X); // Conflict at the end
assertFalse(placeWord(grid, s, w1, undoBuffer, 3));
grid.setLetterLo(OFF_0_2, LETTER_X); // Conflict at the end
assertFalse(placeWord(grid, s, w1));
// Verify grid is still empty (except for 'X')
assertFalse(grid.lisLetterAtLo(OFF_0_0));
assertFalse(grid.lisLetterAtLo(OFF_0_1));
@@ -373,15 +370,16 @@ public class SwedishGeneratorTest {
var lo = (1L << OFF_0_1) | (1L << OFF_0_2);
var s = Slot.from(key, lo, 0L);
var w = AZ;
var undoBuffer = new long[10];
var placed = placeWord(grid, s, w, undoBuffer, 0);
val low = grid.lo;
val top = grid.hi;
var placed = placeWord(grid, s, w);
assertTrue(placed);
assertEquals(LETTER_A, grid.letter32At(OFF_0_1));
assertEquals(LETTER_Z, grid.letter32At(OFF_0_2));
assertEquals(lo, undoBuffer[0]);
grid.undoPlace(undoBuffer[0], undoBuffer[1]);
grid.hi = top;
grid.lo = low;
//grid.undoPlace(undoBuffer[0], undoBuffer[1]);
assertFalse(grid.lisLetterAtLo(OFF_0_1));
assertFalse(grid.lisLetterAtLo(OFF_0_2));
}