|  | @ -88,37 +88,7 @@ std::string CommonCode::to_string(bool shorten) const { // convert uint64_t code | 
			
		
	
		
		
			
				
					|  |  |     return result; // char* -> std::string
 |  |  |     return result; // char* -> std::string
 | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  | bool CommonCode::check(uint64_t common_code) { // check whether common code is valid
 |  |  | bool CommonCode::check(uint64_t common_code) { // whether common code is valid
 | 
			
				
				
			
		
	
		
		
			
				
					|  |  |     uint32_t head = common_code >> 32; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     if (head >= 16 || (head & 0b11) == 0b11) { // check 2x2 block address
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         return false; // invalid common code
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     /// ensure that there are >= 2 space blocks
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     uint32_t fill_num = 0, space_num = 0; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     auto range = Common::range_reverse((uint32_t)common_code); // get common code range
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     for (int i = 0; i < 32; i += 2) { // traverse range
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         switch ((range >> i) & 0b11) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             case 0b00: // space block
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 ++space_num; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             case 0b11: // 1x1 block
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 ++fill_num; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 break; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             case 0b01: // 1x2 block
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             case 0b10: // 2x1 block
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 fill_num += 2; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         if (fill_num >= 16) { // all block filled
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             break; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     if (space_num < 2) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         return false; // at least 2 space
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     return Common::check_case(head, range); // check by head and range
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | } |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | bool CommonCode::check_demo(uint64_t common_code) { |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  |     ///   M_1x1     M_1x2     M_2x1     M_2x2
 |  |  |     ///   M_1x1     M_1x2     M_2x1     M_2x2
 | 
			
		
	
		
		
			
				
					|  |  |     ///  1 0 0 0   1 1 0 0   1 0 0 0   1 1 0 0
 |  |  |     ///  1 0 0 0   1 1 0 0   1 0 0 0   1 1 0 0
 | 
			
		
	
		
		
			
				
					|  |  |     ///  0 0 0 0   0 0 0 0   1 0 0 0   1 1 0 0
 |  |  |     ///  0 0 0 0   0 0 0 0   1 0 0 0   1 1 0 0
 | 
			
		
	
	
		
		
			
				
					|  | 
 |