rzone.h
Go to the documentation of this file.
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 Square pos = state.kingSquare(p);
00032         if (!pos.isOnBoard()) return;
00033         unsigned int index = pos.index();
00034         ntesuki_assert(index < Square::indexMax());
00035         mask.set(index);
00036       }
00037 
00038       Rzone() {}
00039 
00040       Rzone (const Square pos)
00041       {
00042         unsigned int index = pos.index();
00043         ntesuki_assert(index < Square::indexMax());
00044         mask.set(index);
00045       }
00046 
00048       bool any() const
00049       {
00050         return mask.any();
00051       }
00052 
00054       bool test(Square 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:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines