Go to the documentation of this file.00001 #ifndef _NEARMASKE_H
00002 #define _NEARMASKE_H
00003 #include "osl/state/numEffectState.h"
00004 #include "osl/misc/bitOp.h"
00005 #include "osl/ptypeTraits.h"
00006 #include <iosfwd>
00007
00008 namespace osl
00009 {
00010 namespace container
00011 {
00020 class NearMask
00021 {
00022 unsigned int mask;
00023 explicit NearMask(unsigned int value) : mask(value) {}
00024 public:
00025 NearMask() : mask(0) {}
00026 static const NearMask makeDirect(unsigned int value)
00027 {
00028 return NearMask(value);
00029 }
00039 template<Player P,Direction Dir>
00040 static const NearMask make(NumEffectState const& state,Square target) {
00042 Square pos=target-DirectionPlayerTraits<Dir,P>::offset();
00043 Piece p=state.pieceAt(pos);
00044 if(p.canMoveOn<P>()){
00045 if(p.isEmpty())
00046 return NearMask(0x10001<<static_cast<int>(Dir));
00047 return NearMask(1<<static_cast<int>(Dir));
00048 }
00049 return NearMask(0);
00050 }
00051 template<Player P>
00052 static const NearMask make(NumEffectState const& state,Square target) {
00053 NearMask nearMask;
00059 nearMask=NearMask::make<P,U>(state,target);
00060 nearMask|=NearMask::make<P,UL>(state,target);
00061 nearMask|=NearMask::make<P,UR>(state,target);
00062 nearMask|=NearMask::make<P,L>(state,target);
00063 nearMask|=NearMask::make<P,R>(state,target);
00064 nearMask|=NearMask::make<P,DL>(state,target);
00065 nearMask|=NearMask::make<P,D>(state,target);
00066 nearMask|=NearMask::make<P,DR>(state,target);
00067 nearMask|=NearMask::make<P,UUL>(state,target);
00068 nearMask|=NearMask::make<P,UUR>(state,target);
00069 return nearMask;
00070 }
00071
00072 NearMask& operator|=(NearMask r) { mask |= r.mask; return *this; }
00073 NearMask& operator&=(NearMask r) { mask &= r.mask; return *this; }
00074
00075 unsigned int spaceMask() const { return mask >> 16; }
00076 bool isSet(int n) const
00077 {
00078 return mask & (1<<n);
00079 }
00083 int takeOneBit()
00084 {
00085 return misc::BitOp::takeOneBit(mask);
00086 }
00087 bool any() const { return mask; }
00088 unsigned int uintValue() const { return mask; }
00089 };
00090
00091 inline const NearMask operator|(NearMask l, NearMask r) {
00092 NearMask result = l;
00093 return result |= r;
00094 }
00095 inline const NearMask operator&(NearMask l, NearMask r) {
00096 NearMask result = l;
00097 return result &= r;
00098 }
00099 inline bool operator==(NearMask l, NearMask r)
00100 {
00101 return l.uintValue() == r.uintValue();
00102 }
00103 inline bool operator!=(NearMask l, NearMask r)
00104 {
00105 return ! (l == r);
00106 }
00107 inline bool operator<(NearMask l, NearMask r)
00108 {
00109 return l.uintValue() < r.uintValue();
00110 }
00111
00112 std::ostream& operator<<(std::ostream&, NearMask);
00113 }
00114 using container::NearMask;
00115 }
00116 #endif
00117
00118
00119
00120