00001 /* threatmateState.h 00002 */ 00003 #ifndef SEARCH_THREATMATESTATE_H 00004 #define SEARCH_THREATMATESTATE_H 00005 00006 #include "osl/misc/carray.h" 00007 #include "osl/move.h" 00008 #include <iosfwd> 00009 namespace osl 00010 { 00011 namespace search 00012 { 00021 class ThreatmateState 00022 { 00023 public: 00024 enum Status { 00025 UNKNOWN = 0, 00027 THREATMATE, 00029 MAYBE_THREATMATE, 00031 CHECK_AFTER_THREATMATE, 00033 MAY_HAVE_CHECKMATE, 00034 }; 00035 private: 00036 Move threatmate_move; 00037 char current_status; 00038 static const CArray<Status,5*2> transition; 00039 public: 00040 ThreatmateState(Status s=UNKNOWN) : current_status(s) 00041 { 00042 } 00043 void setThreatmate(Status s) { current_status = s; } 00044 void setThreatmate(Move m) { 00045 threatmate_move = m; 00046 current_status = THREATMATE; 00047 } 00048 00049 bool isUnknown() const { return current_status == UNKNOWN; } 00050 bool isThreatmate() const { return current_status == THREATMATE; } 00051 bool maybeThreatmate() const { 00052 return (current_status == THREATMATE) 00053 || (current_status == MAYBE_THREATMATE); 00054 } 00055 bool mayHaveCheckmate() const { 00056 return current_status == MAY_HAVE_CHECKMATE; 00057 } 00058 Status status() const { return static_cast<Status>(current_status); } 00059 const Move threatmateMove() const { return threatmate_move; } 00060 const ThreatmateState newStatus(bool is_check) const 00061 { 00062 return transition[current_status*2+is_check]; 00063 } 00064 00065 void update(const ThreatmateState *parent, bool in_check) 00066 { 00067 if ((! maybeThreatmate()) && parent) 00068 { 00069 *this = parent->newStatus(in_check); 00070 } 00071 } 00072 }; 00073 std::ostream& operator<<(std::ostream&, ThreatmateState); 00074 } // namespace search 00075 } // osl 00076 00077 #endif /* SEARCH_THREATMATESTATE_H */ 00078 // ;;; Local Variables: 00079 // ;;; mode:c++ 00080 // ;;; c-basic-offset:2 00081 // ;;; End: