From dca6e7911c78fca09de8c58f7b1595c5b82d3f0d Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Thu, 12 Jan 2023 00:27:34 +0800 Subject: [PATCH] update: merge bfs search code --- src/core/bfs.h | 14 -------------- src/core/core.cc | 36 +++++++++++++++++++++--------------- src/core/core.h | 3 +-- 3 files changed, 22 insertions(+), 31 deletions(-) delete mode 100644 src/core/bfs.h diff --git a/src/core/bfs.h b/src/core/bfs.h deleted file mode 100644 index 528e4b5..0000000 --- a/src/core/bfs.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#define BFS_INIT \ -int next_addr; \ -cache_size = 1; \ -int current = 0; \ -cache[0].addr = addr; - -#define BFS_LOAD \ -code = cache[current].code; \ -addr = cache[current].addr; \ -int filter = cache[current++].filter; - -#define BFS_STOP (current == cache_size) diff --git a/src/core/core.cc b/src/core/core.cc index 8e7c8bc..00d12fb 100644 --- a/src/core/core.cc +++ b/src/core/core.cc @@ -1,4 +1,3 @@ -#include "bfs.h" #include "core.h" #include "raw_code.h" @@ -44,6 +43,19 @@ #define NEXT_CODE_2x1 (code & ~(F_2x1 << addr) | (C_2x1 << next_addr)) #define NEXT_CODE_2x2 (code & ~(F_2x2 << addr) | (C_2x2 << next_addr)) +#define BFS_INIT \ +int next_addr; \ +cache_size = 1; \ +int current = 0; \ +cache[0].addr = addr; + +#define BFS_LOAD \ +code = cache[current].code; \ +addr = cache[current].addr; \ +int filter = cache[current++].filter; + +#define BFS_STOP (current == cache_size) + inline void Core::cache_insert(Core::cache_t &next_case) { // try to insert into cache auto *p = cache; for (; p < cache + cache_size; ++p) { @@ -131,30 +143,24 @@ void Core::move_2x2(uint64_t code, int addr) { // try to move target 2x2 block } } -void Core::next_step(uint64_t raw_code, uint64_t mask) { // search next step cases -// auto code = raw_code; - - // TODO: make BFS root aka cache[0] static - - auto range = raw_code | mask; - - cache[0].filter = 0; - cache[0].code = raw_code; +void Core::next_step(uint64_t code, uint64_t mask) { // search next step cases + cache[0].filter = 0; // without filter + cache[0].code = code; // bfs root code + auto range = code | mask; for (int addr = 0; range; addr += 3, range >>= 3) { // traverse every 3-bits -// cache[0].addr = addr; switch (range & 0b111) { // match low 3-bits case B_1x1: - move_1x1(raw_code, addr); // try to move 1x1 block + move_1x1(code, addr); // try to move 1x1 block break; case B_1x2: - move_1x2(raw_code, addr); // try to move 1x2 block + move_1x2(code, addr); // try to move 1x2 block break; case B_2x1: - move_2x1(raw_code, addr); // try to move 2x1 block + move_2x1(code, addr); // try to move 2x1 block break; case B_2x2: - move_2x2(raw_code, addr); // try to move 2x2 block + move_2x2(code, addr); // try to move 2x2 block break; default: continue; // B_space or B_fill diff --git a/src/core/core.h b/src/core/core.h index a6c8da5..4272cc9 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -19,8 +19,7 @@ class Core { public: -// void next_step(uint64_t raw_code); - void next_step(uint64_t raw_code, uint64_t mask); + void next_step(uint64_t code, uint64_t mask); Core(void (*release_func)(uint64_t code, uint64_t mask)) : release(release_func) {}