Switch to manual memory management in legal().master/manual
authorYann Dirson <ydirson@altern.org>
Sun, 20 Apr 2008 19:52:42 +0000 (20 21:52 +0200)
committerYann Dirson <ydirson@altern.org>
Sun, 20 Apr 2008 19:52:42 +0000 (20 21:52 +0200)
The auto_ptr-based version was not working as expected, and manual
management is quite easy to do in this case.

src/variants/chess/validator.cpp
src/variants/shogi/validator.cpp

index f652226..f76950d 100644 (file)
@@ -67,17 +67,24 @@ bool Validator::legal(const IState* state, Move& move) const {
     
   const IColor* turn = m_delegator->mover(state, move);
   
-  std::auto_ptr<IState> tmp(state->clone());
+  IState* tmp = state->clone();
+  Q_ASSERT(tmp);
   tmp->move(move);
   
   Point kingPos = tmp->board()->find(Piece(turn, King::self()));
   
-  if (kingPos == Point::invalid())
+  if (kingPos == Point::invalid()) {
+    delete tmp;
     return false;
-    
-  if (m_delegator->attacks(tmp.get(), behaviour->opponent(turn), kingPos))
+  }
+
+  if (m_delegator->attacks(tmp, behaviour->opponent(turn), kingPos)) {
+    delete tmp;
     return false;
-    
+  }
+
+  delete tmp;
+
   // set move type as normal, if not already set    
   if (move.type().isEmpty()) move.setType("normal");
   return true;
index ba6267a..b3c2ddc 100644 (file)
@@ -90,17 +90,24 @@ bool Validator::legal(const IState* state, Move& move) const {
     
   const IColor* turn = m_delegator->mover(state, move);
   
-  std::auto_ptr<IState> tmp(state->clone());
+  IState* tmp = state->clone();
+  Q_ASSERT(tmp);
   tmp->move(move);
   
   Point kingPos = tmp->board()->find(Piece(turn, King::self()));
   
-  if (kingPos == Point::invalid())
+  if (kingPos == Point::invalid()) {
+    delete tmp;
     return false;
-    
-  if (m_delegator->attacks(tmp.get(), behaviour->opponent(turn), kingPos))
+  }
+
+  if (m_delegator->attacks(tmp, behaviour->opponent(turn), kingPos)) {
+    delete tmp;
     return false;
-    
+  }
+
+  delete tmp;
+
   // set move type as normal, if not already set    
   if (move.type().isEmpty()) move.setType("normal");
   return true;