00001 /* rzone.h 00002 */ 00003 #ifndef _NTESUKI_RZONE_H 00004 #define _NTESUKI_RZONE_H 00005 #include "osl/state/numEffectState.h" 00006 #include "osl/ntesuki/ntesukiMoveGenerator.h" 00007 00008 #include "osl/ntesuki/ntesukiExceptions.h" 00009 #include "osl/container/moveVector.h" 00010 00011 #include <osl/stl/vector.h> 00012 #include <bitset> 00013 #include <iosfwd> 00014 00015 using namespace osl::state; 00016 00017 namespace osl 00018 { 00019 namespace ntesuki 00020 { 00021 class 00022 Rzone 00023 { 00024 typedef std::bitset<0x100> mask_t; 00025 mask_t mask; 00026 public: 00028 Rzone (NumEffectState state, 00029 Player p) 00030 { 00031 const Position pos = state.getKingPosition(p); 00032 if (!pos.isOnBoard()) return; 00033 unsigned int index = pos.index(); 00034 ntesuki_assert(index < Position::indexMax()); 00035 mask.set(index); 00036 } 00037 00038 Rzone() {} 00039 00040 Rzone (const Position pos) 00041 { 00042 unsigned int index = pos.index(); 00043 ntesuki_assert(index < Position::indexMax()); 00044 mask.set(index); 00045 } 00046 00048 bool any() const 00049 { 00050 return mask.any(); 00051 } 00052 00054 bool test(Position pos) const 00055 { 00056 return mask.test(pos.index()); 00057 } 00058 00060 bool operator==(const Rzone rhs) const 00061 { 00062 return mask == rhs.mask; 00063 } 00064 00066 Rzone operator+(const Rzone rhs) const 00067 { 00068 mask_t m = mask | rhs.mask; 00069 return Rzone(m); 00070 } 00071 00073 Rzone operator-(const Rzone rhs) const 00074 { 00075 ntesuki_assert((rhs.mask & mask) == rhs.mask); 00076 mask_t m = (rhs.mask ^ mask) & mask; 00077 return Rzone(m); 00078 } 00079 00081 Rzone update(const Rzone rhs) 00082 { 00083 mask_t mask_orig = mask; 00084 mask |= rhs.mask; 00085 00086 mask_t mask_diff = (mask_orig ^ mask) & mask; 00087 00088 return Rzone(mask_diff); 00089 } 00091 friend std::ostream& operator<<(std::ostream& os, 00092 const Rzone& rzone) 00093 { 00094 return os << rzone.mask; 00095 } 00096 private: 00097 Rzone(mask_t _mask) : mask(_mask) {} 00098 00099 }; 00100 } //ntesuki 00101 } //osl 00102 00103 #endif /* _NTESUKI_SEACHER_H */ 00104 // ;;; Local Variables: 00105 // ;;; mode:c++ 00106 // ;;; c-basic-offset:2 00107 // ;;; End: