nearMask.h
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 } // namespace container
00114   using container::NearMask;
00115 } // namespace osl
00116 #endif /* _NEARMASK_H */
00117 // ;;; Local Variables:
00118 // ;;; mode:c++
00119 // ;;; c-basic-offset:2
00120 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines