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