|  |  | @ -60,22 +60,18 @@ cache_insert(next_case); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | ////////////////////////////////////////
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //inline void Core::cache_insert(Core::cache_t &next_case) { // try to insert into cache
 | 
			
		
	
		
			
				
					|  |  |  | template<typename T> | 
			
		
	
		
			
				
					|  |  |  | inline void Core<T>::cache_insert(Core::cache_t &next_case) { // try to insert into cache
 | 
			
		
	
		
			
				
					|  |  |  |     auto *p = cache; | 
			
		
	
		
			
				
					|  |  |  |     for (; p < cache + cache_size; ++p) { | 
			
		
	
		
			
				
					|  |  |  |         if (p->code == next_case.code) { | 
			
		
	
		
			
				
					|  |  |  | inline void Core::cache_insert(Core::cache_t &next_case) { // try to insert into cache
 | 
			
		
	
		
			
				
					|  |  |  |     auto *cache_ptr = cache; | 
			
		
	
		
			
				
					|  |  |  |     for (; cache_ptr < cache + cache_size; ++cache_ptr) { | 
			
		
	
		
			
				
					|  |  |  |         if (cache_ptr->code == next_case.code) { | 
			
		
	
		
			
				
					|  |  |  |             return; // already exist -> insert failed
 | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     *p = next_case; | 
			
		
	
		
			
				
					|  |  |  |     *cache_ptr = next_case; // cache push back
 | 
			
		
	
		
			
				
					|  |  |  |     ++cache_size; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //void Core::move_1x1(uint64_t code, int addr) { // try to move target 1x1 block
 | 
			
		
	
		
			
				
					|  |  |  | template<typename T> | 
			
		
	
		
			
				
					|  |  |  | void Core<T>::move_1x1(uint64_t code, int addr) { // try to move target 1x1 block
 | 
			
		
	
		
			
				
					|  |  |  | void Core::move_1x1(uint64_t code, int addr) { // try to move target 1x1 block
 | 
			
		
	
		
			
				
					|  |  |  |     BFS_INIT | 
			
		
	
		
			
				
					|  |  |  |     while (!BFS_STOP) { // bfs search process
 | 
			
		
	
		
			
				
					|  |  |  |         BFS_LOAD | 
			
		
	
	
		
			
				
					|  |  | @ -94,9 +90,7 @@ void Core<T>::move_1x1(uint64_t code, int addr) { // try to move target 1x1 bloc | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //void Core::move_1x2(uint64_t code, int addr) { // try to move target 1x2 block
 | 
			
		
	
		
			
				
					|  |  |  | template<typename T> | 
			
		
	
		
			
				
					|  |  |  | void Core<T>::move_1x2(uint64_t code, int addr) { // try to move target 1x2 block
 | 
			
		
	
		
			
				
					|  |  |  | void Core::move_1x2(uint64_t code, int addr) { // try to move target 1x2 block
 | 
			
		
	
		
			
				
					|  |  |  |     BFS_INIT | 
			
		
	
		
			
				
					|  |  |  |     while (!BFS_STOP) { // bfs search process
 | 
			
		
	
		
			
				
					|  |  |  |         BFS_LOAD | 
			
		
	
	
		
			
				
					|  |  | @ -115,9 +109,7 @@ void Core<T>::move_1x2(uint64_t code, int addr) { // try to move target 1x2 bloc | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //void Core::move_2x1(uint64_t code, int addr) { // try to move target 2x1 block
 | 
			
		
	
		
			
				
					|  |  |  | template<typename T> | 
			
		
	
		
			
				
					|  |  |  | void Core<T>::move_2x1(uint64_t code, int addr) { // try to move target 2x1 block
 | 
			
		
	
		
			
				
					|  |  |  | void Core::move_2x1(uint64_t code, int addr) { // try to move target 2x1 block
 | 
			
		
	
		
			
				
					|  |  |  |     BFS_INIT | 
			
		
	
		
			
				
					|  |  |  |     while (!BFS_STOP) { // bfs search process
 | 
			
		
	
		
			
				
					|  |  |  |         BFS_LOAD | 
			
		
	
	
		
			
				
					|  |  | @ -136,9 +128,7 @@ void Core<T>::move_2x1(uint64_t code, int addr) { // try to move target 2x1 bloc | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //void Core::move_2x2(uint64_t code, int addr) { // try to move target 2x2 block
 | 
			
		
	
		
			
				
					|  |  |  | template<typename T> | 
			
		
	
		
			
				
					|  |  |  | void Core<T>::move_2x2(uint64_t code, int addr) { // try to move target 2x2 block
 | 
			
		
	
		
			
				
					|  |  |  | void Core::move_2x2(uint64_t code, int addr) { // try to move target 2x2 block
 | 
			
		
	
		
			
				
					|  |  |  |     BFS_INIT | 
			
		
	
		
			
				
					|  |  |  |     while (!BFS_STOP) { // bfs search process
 | 
			
		
	
		
			
				
					|  |  |  |         BFS_LOAD | 
			
		
	
	
		
			
				
					|  |  | @ -157,9 +147,7 @@ void Core<T>::move_2x2(uint64_t code, int addr) { // try to move target 2x2 bloc | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //void Core::next_step(uint64_t code, uint64_t mask) { // search next step cases
 | 
			
		
	
		
			
				
					|  |  |  | template<typename T> | 
			
		
	
		
			
				
					|  |  |  | void Core<T>::next_step(uint64_t code, uint64_t mask) { // search next step cases
 | 
			
		
	
		
			
				
					|  |  |  | 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; | 
			
		
	
	
		
			
				
					|  |  | @ -185,9 +173,7 @@ void Core<T>::next_step(uint64_t code, uint64_t mask) { // search next step case | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // TODO: try to send multi-items data
 | 
			
		
	
		
			
				
					|  |  |  |             for (int i = 1; i < cache_size; ++i) { | 
			
		
	
		
			
				
					|  |  |  |                 (src_class->*release)(cache[i].code, cache[i].mask); | 
			
		
	
		
			
				
					|  |  |  | //                release(cache[i].code, cache[i].mask); // release next cases
 | 
			
		
	
		
			
				
					|  |  |  | //                release_next(cache[i].code, cache[i].mask); // release next cases
 | 
			
		
	
		
			
				
					|  |  |  |                 release(cache[i].code, cache[i].mask); // release next cases
 | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             cache_size = 1; // reset cache size
 | 
			
		
	
	
		
			
				
					|  |  | 
 |