threatmateState.h
Go to the documentation of this file.
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:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines