Fermat
bitmask.h
1 #pragma once
2 
3 #include <cugar/basic/types.h>
4 
5 namespace cugar {
6 
10 
13 template <uint32 WORDS>
14 struct Bitmask
15 {
16  CUGAR_HOST_DEVICE Bitmask() { for (int32 i = 0; i < WORDS; ++i) bits[i] = 0; }
17 
18  CUGAR_HOST_DEVICE void set(const int32 i)
19  {
20  const int32 word_index = i >> 5;
21  const int32 bit_index = i & 31;
22  bits[ word_index ] |= (1 << bit_index);
23  }
24  CUGAR_HOST_DEVICE void clear(const int32 i)
25  {
26  const int32 word_index = i >> 5;
27  const int32 bit_index = i & 31;
28  bits[ word_index ] &= ~(1 << bit_index);
29  }
30  CUGAR_HOST_DEVICE bool get(const int32 i) const
31  {
32  const int32 word_index = i >> 5;
33  const int32 bit_index = i & 31;
34  return bits[ word_index ] & (1 << bit_index);
35  }
36 
37  CUGAR_HOST_DEVICE int32 get_word(const int32 i) const { return bits[i]; }
38 
39  int32 bits[WORDS];
40 };
41 
44 template <>
45 struct Bitmask<1>
46 {
47  CUGAR_HOST_DEVICE Bitmask() : bits(0) {}
48 
49  CUGAR_HOST_DEVICE void set(const int32 i) { bits |= (1 << i); }
50  CUGAR_HOST_DEVICE void clear(const int32 i) { bits &= ~(1 << i); }
51  CUGAR_HOST_DEVICE bool get(const int32 i) const { return bits & (1 << i); }
52 
53  CUGAR_HOST_DEVICE int32 get_word(const int32 i) const { return bits; }
54  CUGAR_HOST_DEVICE int32 get_bits(const int32 offset) const { return bits >> offset; }
55 
56  int32 bits;
57 };
58 
61 template <>
62 struct Bitmask<2>
63 {
64  CUGAR_HOST_DEVICE Bitmask() { bits0 = bits1 = 0; }
65 
66  CUGAR_HOST_DEVICE void set(const int32 i)
67  {
68  const int32 word_index = i >> 5;
69  const int32 bit_index = i & 31;
70  if (word_index == 0) bits0 |= (1 << bit_index);
71  if (word_index != 0) bits1 |= (1 << bit_index);
72  }
73  CUGAR_HOST_DEVICE void clear(const int32 i)
74  {
75  const int32 word_index = i >> 5;
76  const int32 bit_index = i & 31;
77  if (word_index == 0) bits0 &= ~(1 << bit_index);
78  if (word_index != 0) bits1 &= ~(1 << bit_index);
79  }
80  CUGAR_HOST_DEVICE bool get(const int32 i) const
81  {
82  const int32 word_index = i >> 5;
83  const int32 bit_index = i & 31;
84  return (word_index ? bits1 : bits0) & (1 << bit_index);
85  }
86 
87  CUGAR_HOST_DEVICE int32 get_word(const int32 i) const { return i ? bits1 : bits0; }
88 
89  CUGAR_HOST_DEVICE int32 get_bits(const int32 offset) const
90  {
91  const int32 word_index = offset >> 5;
92  const int32 bit_offset = offset & 31;
93  return (word_index ? bits1 : bits0) >> bit_offset;
94  }
95 
96  int32 bits0;
97  int32 bits1;
98 };
99 
101 
102 } // namespace cugar
Definition: bitmask.h:14
Define a vector_view POD type and plain_view() for std::vector.
Definition: diff.h:38