| 
					
				 | 
			
			
				@@ -55,6 +55,9 @@ public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     inline void iterateKing(Args&&... args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     template<Side side, typename... Args> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    inline void iterateCastling(Args&&... args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    template<Side side, typename... Args> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     inline void iteratePawns(Args&&... args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     template<Side side, typename... Args> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -111,6 +114,7 @@ inline void chessy::Search<T>::iterateAll(Args&&... args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     iterateRooks<side, Args...>(std::forward<Args>(args)...); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     iterateQueens<side, Args...>(std::forward<Args>(args)...); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     iterateKing<side, Args...>(std::forward<Args>(args)...); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    iterateCastling<side, Args...>(std::forward<Args>(args)...); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -262,6 +266,26 @@ inline void chessy::Search<T>::iterateKing(Args&&... args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template<typename T> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template<chessy::Side side, typename... Args> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline void chessy::Search<T>::iterateCastling(Args&&... args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    MoveInfo moveInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    moveInfo.movedPiece = PieceType::KING; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (game.getCanCastleKingSide(side)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Bitboard king = board.getKing<side>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Bitboard target = king.bits >> 2; // move king to the right 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Bitboard rook = king.bits >> 3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Bitboard rookTarget = king.bits >> 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!(target | friends<WHITE_SIDE>() | friends<BLACK_SIDE>()) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            !(rookTarget | friends<WHITE_SIDE>() | friends<BLACK_SIDE>())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        moveInfo.move = Move{ king, target, true }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+template<typename T> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+template<chessy::Side side, typename... Args> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 inline void chessy::Search<T>::iterateSinglePawnPushes(Args&&... args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     MoveInfo moveInfo; 
			 |