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 #ifdef OSL_SMP 00009 # include "osl/misc/lightMutex.h" 00010 #endif 00011 #include <iosfwd> 00012 namespace osl 00013 { 00014 namespace search 00015 { 00016 struct ThreatmateStateData 00017 { 00018 char current_status; 00019 }; 00020 class DualThreatmateState; 00029 class ThreatmateState : protected ThreatmateStateData 00030 { 00031 friend class DualThreatmateState; 00032 public: 00033 enum Status { 00034 UNKNOWN = 0, 00036 THREATMATE, 00038 MAYBE_THREATMATE, 00040 CHECK_AFTER_THREATMATE, 00042 MAY_HAVE_CHECKMATE, 00043 }; 00044 private: 00045 static const CArray<Status,5*2> transition; 00046 public: 00047 ThreatmateState(Status s=UNKNOWN) 00048 { 00049 current_status = s; 00050 } 00051 void setThreatmate(Status s) { 00052 current_status = s; 00053 } 00054 bool isUnknown() const { 00055 return current_status == UNKNOWN; 00056 } 00057 bool isThreatmate() const { 00058 return current_status == THREATMATE; 00059 } 00060 bool maybeThreatmate() const { 00061 return (current_status == THREATMATE) 00062 || (current_status == MAYBE_THREATMATE); 00063 } 00064 bool mayHaveCheckmate() const { 00065 return current_status == MAY_HAVE_CHECKMATE; 00066 } 00067 Status status() const { 00068 return static_cast<Status>(current_status); 00069 } 00070 const ThreatmateState newStatus(bool is_check) const 00071 { 00072 return transition[current_status*2+is_check]; 00073 } 00074 00075 void update(const ThreatmateState *parent, bool in_check) 00076 { 00077 if (maybeThreatmate() || ! parent) 00078 return; 00079 const ThreatmateState new_status = parent->newStatus(in_check); 00080 *this = new_status; 00081 } 00082 }; 00083 std::ostream& operator<<(std::ostream&, ThreatmateState); 00084 } // namespace search 00085 } // osl 00086 00087 #endif /* SEARCH_THREATMATESTATE_H */ 00088 // ;;; Local Variables: 00089 // ;;; mode:c++ 00090 // ;;; c-basic-offset:2 00091 // ;;; End: