00001 /* dualThreatmateState.h 00002 */ 00003 #ifndef OSL_SEARCH__DUALTHREATMATESTATE_H 00004 #define OSL_SEARCH__DUALTHREATMATESTATE_H 00005 00006 #include "osl/search/threatmateState.h" 00007 #include <iosfwd> 00008 00009 namespace osl 00010 { 00011 namespace search 00012 { 00013 class DualThreatmateState 00014 { 00015 CArray<ThreatmateState,2> king_status; 00016 ThreatmateState& wstatus(Player king) 00017 { 00018 return king_status[playerToIndex(king)]; 00019 } 00020 public: 00021 explicit DualThreatmateState(ThreatmateState::Status b=ThreatmateState::UNKNOWN, 00022 ThreatmateState::Status w=ThreatmateState::UNKNOWN) 00023 { 00024 wstatus(BLACK) = b; 00025 wstatus(WHITE) = w; 00026 } 00027 const ThreatmateState& status(Player king) const 00028 { 00029 return king_status[playerToIndex(king)]; 00030 } 00031 void setThreatmate(Player king, Move m) { 00032 wstatus(king).setThreatmate(m); 00033 } 00034 00035 bool isThreatmate(Player king) const { 00036 return status(king).isThreatmate(); 00037 } 00038 bool maybeThreatmate(Player king) const { 00039 return status(king).maybeThreatmate(); 00040 } 00041 bool mayHaveCheckmate(Player king) const { 00042 return status(king).mayHaveCheckmate(); 00043 } 00044 const Move threatmateMove(Player king) const { 00045 return status(king).threatmateMove(); 00046 } 00047 void update(Player turn, const DualThreatmateState *parent, bool in_check) 00048 { 00049 if (parent) 00050 { 00051 if (! maybeThreatmate(turn)) 00052 wstatus(turn).update(&parent->status(turn), in_check); 00053 if (! mayHaveCheckmate(alt(turn))) 00054 wstatus(alt(turn)).update(&parent->status(alt(turn)), in_check); 00055 } 00056 } 00057 }; 00058 std::ostream& operator<<(std::ostream&, DualThreatmateState); 00059 } 00060 } // namespace osl 00061 00062 #endif /* OSL_SEARCH__DUALTHREATMATESTATE_H */ 00063 // ;;; Local Variables: 00064 // ;;; mode:c++ 00065 // ;;; c-basic-offset:2 00066 // ;;; End: