| 
					
				 | 
			
			
				@@ -3,8 +3,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using namespace chessy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-template class MoveGenerator<0>; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-template class MoveGenerator<1>; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+template class PawnPushGenerator<WHITE_SIDE>; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+template class PawnPushGenerator<BLACK_SIDE>; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 std::string chessy::Move::asString(void) const 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -12,18 +12,61 @@ std::string chessy::Move::asString(void) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return origin.getName() + "-" + destination.getName(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <iostream> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template<int side> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-typename MoveGenerator<side>::MoveIterator MoveGenerator<side>::begin(void) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+typename PawnPushGenerator<side>::MoveIterator PawnPushGenerator<side>::begin(void) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return MoveIterator{ chessGame.getBoard().getWhitePawns() }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const Board& board = chessGame.getBoard(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Bitboard movedPieces = side == WHITE_SIDE ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        board.getWhitePawns() : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        board.getBlackPawns(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (side == WHITE_SIDE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        movedPieces.moveNorthOne(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        movedPieces.moveSouthOne(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    movedPieces &= ~(side == WHITE_SIDE ? board.getBlacks() : board.getWhites()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    std::cout << movedPieces << std::endl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return MoveIterator{ movedPieces }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template<int side> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-typename MoveGenerator<side>::MoveIterator chessy::MoveGenerator<side>::end(void) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+typename PawnPushGenerator<side>::MoveIterator PawnPushGenerator<side>::end(void) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return MoveIterator{ PositionSet::end() }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return MoveIterator{ 0 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const std::array<Bitboard, 64> KnightMoveGenerator::moveSets = generateKnightMoves(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Bitboard KnightMoveGenerator::generateFromIndex(Index i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int row = i.getRow(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int column = i.getColumn(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Bitboard result = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto makeBitboardIfValid = [](int row, int column) -> Bitboard { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return row < 8 && column < 8 && row >= 0 && column >= 0 ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Bitboard::fromIndex({row, column}) : Bitboard{ 0 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row - 2, column - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row - 1, column - 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row + 2, column - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row + 1, column - 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row - 2, column + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row - 1, column + 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row + 2, column + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result |= makeBitboardIfValid(row + 1, column + 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+std::array<Bitboard, 64> KnightMoveGenerator::generateKnightMoves(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    std::array<Bitboard, 64> moves{}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (int8_t i = 0; i < moves.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        moves[i] = generateFromIndex(Index{ i }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return moves; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |