Replace Position::copy()
authorMarco Costalba <mcostalba@gmail.com>
Fri, 6 Apr 2012 18:13:48 +0000 (19:13 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 6 Apr 2012 18:42:45 +0000 (19:42 +0100)
With assignment operator. And fix Position::flip().

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/benchmark.cpp
src/position.cpp
src/position.h
src/thread.cpp

index f42c0e6c312460742dd944d1765398bd2f001788..67902062f6cfa9b6e206cf91fe97885583fa76cd 100644 (file)
@@ -107,7 +107,7 @@ void benchmark(istringstream& is) {
 
   for (size_t i = 0; i < fens.size(); i++)
   {
 
   for (size_t i = 0; i < fens.size(); i++)
   {
-      Position pos(fens[i], false, NULL);
+      Position pos(fens[i], false, Threads.main_thread());
 
       cerr << "\nPosition: " << i + 1 << '/' << fens.size() << endl;
 
 
       cerr << "\nPosition: " << i + 1 << '/' << fens.size() << endl;
 
index 3a0f8b1c90f8bba670b942488b87966092cefd69..318f0f2c51ad94fb98c9648aa269f4fd19d4319f 100644 (file)
@@ -92,16 +92,15 @@ CheckInfo::CheckInfo(const Position& pos) {
 }
 
 
 }
 
 
-/// Position::copy() creates a copy of 'pos'. We want the new born Position
+/// Position::operator=() creates a copy of 'pos'. We want the new born Position
 /// object do not depend on any external data so we detach state pointer from
 /// the source one.
 
 /// object do not depend on any external data so we detach state pointer from
 /// the source one.
 
-void Position::copy(const Position& pos, Thread* th) {
+void Position::operator=(const Position& pos) {
 
   memcpy(this, &pos, sizeof(Position));
   startState = *st;
   st = &startState;
 
   memcpy(this, &pos, sizeof(Position));
   startState = *st;
   st = &startState;
-  thisThread = th;
   nodes = 0;
 
   assert(pos_is_ok());
   nodes = 0;
 
   assert(pos_is_ok());
@@ -331,7 +330,7 @@ void Position::print(Move move) const {
 
   if (move)
   {
 
   if (move)
   {
-      Position p(*this, thisThread);
+      Position p(*this);
       cout << "\nMove is: " << (sideToMove == BLACK ? ".." : "") << move_to_san(p, move);
   }
 
       cout << "\nMove is: " << (sideToMove == BLACK ? ".." : "") << move_to_san(p, move);
   }
 
@@ -1540,21 +1539,20 @@ void Position::init() {
 
 void Position::flip() {
 
 
 void Position::flip() {
 
-  // Make a copy of current position before to start changing
-  const Position pos(*this, thisThread);
+  const Position pos(*this);
 
   clear();
 
   clear();
+
+  sideToMove = ~pos.side_to_move();
   thisThread = pos.this_thread();
   thisThread = pos.this_thread();
+  nodes = pos.nodes_searched();
+  chess960 = pos.is_chess960();
+  startPosPly = pos.startpos_ply_counter();
 
 
-  // Board
   for (Square s = SQ_A1; s <= SQ_H8; s++)
       if (!pos.square_empty(s))
           put_piece(Piece(pos.piece_on(s) ^ 8), ~s);
 
   for (Square s = SQ_A1; s <= SQ_H8; s++)
       if (!pos.square_empty(s))
           put_piece(Piece(pos.piece_on(s) ^ 8), ~s);
 
-  // Side to move
-  sideToMove = ~pos.side_to_move();
-
-  // Castling rights
   if (pos.can_castle(WHITE_OO))
       set_castle_right(BLACK, ~pos.castle_rook_square(WHITE_OO));
   if (pos.can_castle(WHITE_OOO))
   if (pos.can_castle(WHITE_OO))
       set_castle_right(BLACK, ~pos.castle_rook_square(WHITE_OO));
   if (pos.can_castle(WHITE_OOO))
@@ -1564,22 +1562,14 @@ void Position::flip() {
   if (pos.can_castle(BLACK_OOO))
       set_castle_right(WHITE, ~pos.castle_rook_square(BLACK_OOO));
 
   if (pos.can_castle(BLACK_OOO))
       set_castle_right(WHITE, ~pos.castle_rook_square(BLACK_OOO));
 
-  // En passant square
   if (pos.st->epSquare != SQ_NONE)
       st->epSquare = ~pos.st->epSquare;
 
   if (pos.st->epSquare != SQ_NONE)
       st->epSquare = ~pos.st->epSquare;
 
-  // Checkers
-  st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove);
-
-  // Hash keys
   st->key = compute_key();
   st->pawnKey = compute_pawn_key();
   st->materialKey = compute_material_key();
   st->key = compute_key();
   st->pawnKey = compute_pawn_key();
   st->materialKey = compute_material_key();
-
-  // Incremental scores
   st->psqScore = compute_psq_score();
   st->psqScore = compute_psq_score();
-
-  // Material
+  st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove);
   st->npMaterial[WHITE] = compute_non_pawn_material(WHITE);
   st->npMaterial[BLACK] = compute_non_pawn_material(BLACK);
 
   st->npMaterial[WHITE] = compute_non_pawn_material(WHITE);
   st->npMaterial[BLACK] = compute_non_pawn_material(BLACK);
 
index b59e5923e3efab97c8733aa0fe12fd2a02910d51..946608c657672b743edfa3c39c4dd337a7b4acb6 100644 (file)
@@ -84,18 +84,14 @@ struct StateInfo {
 ///    * A counter for detecting 50 move rule draws.
 
 class Position {
 ///    * A counter for detecting 50 move rule draws.
 
 class Position {
-
-  // No copy c'tor or assignment operator allowed
-  Position(const Position&);
-  Position& operator=(const Position&);
-
 public:
   Position() {}
 public:
   Position() {}
-  Position(const Position& p, Thread* t) { copy(p, t); }
+  Position(const Position& p) { *this = p; }
+  Position(const Position& p, Thread* t) { *this = p; thisThread = t; }
   Position(const std::string& f, bool c960, Thread* t) { from_fen(f, c960, t); }
   Position(const std::string& f, bool c960, Thread* t) { from_fen(f, c960, t); }
+  void operator=(const Position&);
 
   // Text input/output
 
   // Text input/output
-  void copy(const Position& pos, Thread* th);
   void from_fen(const std::string& fen, bool isChess960, Thread* th);
   const std::string to_fen() const;
   void print(Move m = MOVE_NONE) const;
   void from_fen(const std::string& fen, bool isChess960, Thread* th);
   const std::string to_fen() const;
   void print(Move m = MOVE_NONE) const;
index fe7a669b8e66f989d990e89f9e24127afe1848f4..cb3f8223aacf26a93199c7c2ed6cef1b8a02916c 100644 (file)
@@ -434,7 +434,7 @@ void ThreadsManager::start_searching(const Position& pos, const LimitsType& limi
   Signals.stopOnPonderhit = Signals.firstRootMove = false;
   Signals.stop = Signals.failedLowAtRoot = false;
 
   Signals.stopOnPonderhit = Signals.firstRootMove = false;
   Signals.stop = Signals.failedLowAtRoot = false;
 
-  RootPosition.copy(pos, main_thread());
+  RootPosition = pos;
   Limits = limits;
   RootMoves.clear();
 
   Limits = limits;
   RootMoves.clear();