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 "osl/effect_util/sendOffPosition.h" 00008 #include <iosfwd> 00009 00010 namespace osl 00011 { 00012 namespace search 00013 { 00014 class DualThreatmateState 00015 { 00016 CArray<Move,2> threatmate_move; 00017 CArray<ThreatmateState,2> king_status; 00018 ThreatmateState& wstatus(Player king) 00019 { 00020 return king_status[king]; 00021 } 00022 public: 00024 mutable SendOffPosition::SendOff8 sendoffs; 00025 struct Flags { 00026 bool is_king_in_check:4; 00027 char static_value_type:4; 00028 } flags; 00029 explicit DualThreatmateState(ThreatmateState::Status b=ThreatmateState::UNKNOWN, 00030 ThreatmateState::Status w=ThreatmateState::UNKNOWN) 00031 : sendoffs(SendOffPosition::invalidData()) 00032 { 00033 wstatus(BLACK) = b; 00034 wstatus(WHITE) = w; 00035 flags.is_king_in_check = false; 00036 flags.static_value_type = 0; 00037 } 00038 const ThreatmateState& status(Player king) const 00039 { 00040 return king_status[king]; 00041 } 00042 void setThreatmate(Player king, Move m) { 00043 assert(m.isNormal()); 00044 wstatus(king).setThreatmate(ThreatmateState::THREATMATE); 00045 threatmate_move[king] = m; 00046 } 00047 00048 bool isThreatmate(Player king) const { 00049 return status(king).isThreatmate(); 00050 } 00051 const Move threatmateMove(Player king) const { 00052 return threatmate_move[king]; 00053 } 00054 bool maybeThreatmate(Player king) const { 00055 return status(king).maybeThreatmate(); 00056 } 00057 bool mayHaveCheckmate(Player king) const { 00058 return status(king).mayHaveCheckmate(); 00059 } 00060 void updateInLock(Player turn, const DualThreatmateState *parent, bool in_check) 00061 { 00062 if (parent) 00063 { 00064 if (! maybeThreatmate(turn)) 00065 wstatus(turn).update(&parent->status(turn), in_check); 00066 if (! mayHaveCheckmate(alt(turn))) 00067 wstatus(alt(turn)).update(&parent->status(alt(turn)), in_check); 00068 } 00069 } 00070 }; 00071 std::ostream& operator<<(std::ostream&, DualThreatmateState); 00072 } 00073 } // namespace osl 00074 00075 #endif /* OSL_SEARCH__DUALTHREATMATESTATE_H */ 00076 // ;;; Local Variables: 00077 // ;;; mode:c++ 00078 // ;;; c-basic-offset:2 00079 // ;;; coding:utf-8 00080 // ;;; End: