All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
pieceMask.h
Go to the documentation of this file.
1 #ifndef _PIECE_MASK_H
2 #define _PIECE_MASK_H
3 #include "osl/config.h"
4 
5 #include "osl/misc/mask.h"
6 #include "osl/ptypeTraits.h"
7 #if OSL_WORDSIZE == 64
9 #elif OSL_WORDSIZE == 32
11 #endif
12 
13 #include <iosfwd>
14 
15 namespace osl
16 {
17  namespace container
18  {
19 #if OSL_WORDSIZE == 64
20  typedef PieceMask64 PieceMaskBase;
21 #elif OSL_WORDSIZE == 32
22  typedef PieceMask32 PieceMaskBase;
23 #endif
24 
31  class PieceMask : public PieceMaskBase
32  {
33  public:
34  PieceMask() {}
35  PieceMask(const PieceMaskBase& base) : PieceMaskBase(base) {}
36  static const mask_t numToMask(int num) {
37  return mask_t::makeDirect(1) << PieceMask::numToOffset(num);
38  }
39  void setMask(int index,mask_t val) {
40  mutableMask(index)=val;
41  }
42  private:
43  mask_t& mutableMaskNum(int num) {
44  return mutableMask(numToIndex(num));
45  }
46  const mask_t getMaskNum(int num) const {
47  return getMask(numToIndex(num));
48  }
49  public:
50  void xorMask(int index,mask_t val) {
51  mutableMask(index)^=val;
52  }
53  void orMask(int index,mask_t val) {
54  mutableMask(index)|=val;
55  }
56  bool test(int num) const {
57  return (getMaskNum(num)&numToMask(num)).any();
58  }
59  void set(int num) {
60  mutableMaskNum(num)|=numToMask(num);
61  }
62  void flip(int num) {
63  mutableMaskNum(num)^=numToMask(num);
64  }
65  void reset(int num) {
66  mutableMaskNum(num)&= ~numToMask(num);
67  }
68  bool any() const { return ! none(); }
69 
70  const mask_t getMask(int num) const { return PieceMaskBase::getMask(num); }
72  template <Ptype PTYPE>
73  const mask_t getMask() const { return getMask(PtypeFuns<PTYPE>::indexNum); }
74 
76  template <Ptype PTYPE>
77  const mask_t selectBit() const
78  {
79  mask_t mask = getMask<PTYPE>();
80  mask &= mask_t::makeDirect(PtypeFuns<PtypeFuns<PTYPE>::basicType>::indexMask);
81  return mask;
82  }
84  template <Ptype PTYPE>
85  void clearBit()
86  {
87  mask_t& mask = mutableMask(PtypeFuns<PTYPE>::indexNum);
88  mask &= ~mask_t::makeDirect(PtypeFuns<PtypeFuns<PTYPE>::basicType>::indexMask);
89  }
91  template <Ptype PTYPE>
92  void setBit()
93  {
94  mask_t& mask = mutableMask(PtypeFuns<PTYPE>::indexNum);
95  mask |= mask_t::makeDirect(PtypeFuns<PtypeFuns<PTYPE>::basicType>::indexMask);
96  }
97  };
98 
99  // TODO: PieceMask32 と PieceMask64 に分離
100  inline const PieceMask operator&(const PieceMask &m1, const PieceMask &m2) {
101 #if OSL_WORDSIZE == 64
102  return PieceMask64(m1.getMask(0)&m2.getMask(0));
103 #elif OSL_WORDSIZE == 32
104  return PieceMask32(m1.getMask(0)&m2.getMask(0),
105  m1.getMask(1)&m2.getMask(1));
106 #endif
107  }
108 
109  // TODO: PieceMask32 と PieceMask64 に分離
110  inline const PieceMask operator|(const PieceMask &m1, const PieceMask &m2) {
111 #if OSL_WORDSIZE == 64
112  return PieceMask64(m1.getMask(0)|m2.getMask(0));
113 #elif OSL_WORDSIZE == 32
114  return PieceMask32(m1.getMask(0)|m2.getMask(0),
115  m1.getMask(1)|m2.getMask(1));
116 #endif
117  }
118  // TODO: PieceMask32 と PieceMask64 に分離
119  inline const PieceMask operator~(const PieceMask &m1) {
120 #if OSL_WORDSIZE == 64
121  return PieceMask64(~m1.getMask(0));
122 #elif OSL_WORDSIZE == 32
123  return PieceMask32(~m1.getMask(0),~m1.getMask(1));
124 #endif
125  }
126 
127  inline bool operator==(const PieceMask &m1, const PieceMask &m2){
128  return m1.getMask(0)==m2.getMask(0) && m1.getMask(1)==m2.getMask(1);
129  }
130  inline bool operator!=(const PieceMask &m1, const PieceMask &m2)
131  {
132  return ! (m1 == m2);
133  }
134  std::ostream& operator<<(std::ostream& os,PieceMask const& pieceMask);
135  } // namespace container
136  using container::PieceMask;
137 } // namespace osl
138 
139 
140 #endif /* _PIECE_MASK_H */
141 // ;;; Local Variables:
142 // ;;; mode:c++
143 // ;;; c-basic-offset:2
144 // ;;; End: