bitset.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_UTIL_BITSET_HPP_INCLUDED
6 #define UAVCAN_UTIL_BITSET_HPP_INCLUDED
7 
8 #include <cassert>
9 #include <cstddef>
10 #include <cstring>
11 #include <uavcan/build_config.hpp>
12 
13 namespace uavcan
14 {
18 template <std::size_t NumBits>
20 {
21  enum { NumBytes = (NumBits + 7) / 8 };
22 
23  static std::size_t getByteNum(std::size_t bit_num) { return bit_num / 8; }
24 
25  static std::size_t getBitNum(const std::size_t bit_num) { return bit_num % 8; }
26 
27  static void validatePos(std::size_t& inout_pos)
28  {
29  if (inout_pos >= NumBits)
30  {
31  UAVCAN_ASSERT(0);
32  inout_pos = NumBits - 1;
33  }
34  }
35 
36  char data_[NumBytes];
37 
38 public:
39  class Reference
40  {
41  friend class BitSet;
42 
43  BitSet* const parent_;
45 
46  Reference(BitSet* arg_parent, std::size_t arg_bitpos)
47  : parent_(arg_parent)
48  , bitpos_(arg_bitpos)
49  { }
50 
51  public:
53  {
54  parent_->set(bitpos_, x);
55  return *this;
56  }
57 
59  {
60  parent_->set(bitpos_, x);
61  return *this;
62  }
63 
64  bool operator~() const
65  {
66  return !parent_->test(bitpos_);
67  }
68 
69  operator bool() const
70  {
71  return parent_->test(bitpos_);
72  }
73  };
74 
76  : data_()
77  {
78  reset();
79  }
80 
82  {
83  std::memset(data_, 0, NumBytes);
84  return *this;
85  }
86 
88  {
89  std::memset(data_, 0xFF, NumBytes);
90  return *this;
91  }
92 
93  BitSet<NumBits>& set(std::size_t pos, bool val = true)
94  {
95  validatePos(pos);
96  if (val)
97  {
98  data_[getByteNum(pos)] = char(data_[getByteNum(pos)] | (1 << getBitNum(pos)));
99  }
100  else
101  {
102  data_[getByteNum(pos)] = char(data_[getByteNum(pos)] & ~(1 << getBitNum(pos)));
103  }
104  return *this;
105  }
106 
107  bool test(std::size_t pos) const
108  {
109  return (data_[getByteNum(pos)] & (1 << getBitNum(pos))) != 0;
110  }
111 
112  bool any() const
113  {
114  for (std::size_t i = 0; i < NumBits; ++i)
115  {
116  if (test(i))
117  {
118  return true;
119  }
120  }
121  return false;
122  }
123 
125  {
126  std::size_t retval = 0;
127  for (std::size_t i = 0; i < NumBits; ++i)
128  {
129  retval += test(i) ? 1U : 0U;
130  }
131  return retval;
132  }
133 
134  std::size_t size() const { return NumBits; }
135 
136  bool operator[](std::size_t pos) const
137  {
138  return test(pos);
139  }
140 
141  Reference operator[](std::size_t pos)
142  {
143  validatePos(pos);
144  return Reference(this, pos);
145  }
146 
148  {
149  if (&rhs == this)
150  {
151  return *this;
152  }
153  for (std::size_t i = 0; i < NumBytes; ++i)
154  {
155  data_[i] = rhs.data_[i];
156  }
157  return *this;
158  }
159 
160  bool operator!=(const BitSet<NumBits>& rhs) const { return !operator==(rhs); }
161  bool operator==(const BitSet<NumBits>& rhs) const
162  {
163  for (std::size_t i = 0; i < NumBits; ++i)
164  {
165  if (test(i) != rhs.test(i))
166  {
167  return false;
168  }
169  }
170  return true;
171  }
172 };
173 
174 template <> class BitSet<0>;
175 
176 
177 template <typename Stream, std::size_t NumBits>
178 Stream& operator<<(Stream& s, const BitSet<NumBits>& x)
179 {
180  for (std::size_t i = NumBits; i > 0; --i)
181  {
182  s << (x.test(i-1) ? "1" : "0");
183  }
184  return s;
185 }
186 
187 }
188 
189 #endif // UAVCAN_UTIL_BITSET_HPP_INCLUDED
uavcan::operator==
UAVCAN_EXPORT EnableIf<!IsSameType< R, Array< T, ArrayMode, MaxSize > >::Result, bool >::Type operator==(const R &rhs, const Array< T, ArrayMode, MaxSize > &lhs)
Definition: array.hpp:1101
std::size_t
unsigned long size_t
Definition: coverity_scan_model.cpp:19
uavcan::BitSet::BitSet
BitSet()
Definition: bitset.hpp:75
uavcan::BitSet::test
bool test(std::size_t pos) const
Definition: bitset.hpp:107
uavcan::BitSet::Reference::bitpos_
const std::size_t bitpos_
Definition: bitset.hpp:44
uavcan::operator<<
OStream & operator<<(OStream &s, long long x)
Definition: ostream.hpp:40
uavcan::BitSet::count
std::size_t count() const
Definition: bitset.hpp:124
uavcan::BitSet::Reference::Reference
Reference(BitSet *arg_parent, std::size_t arg_bitpos)
Definition: bitset.hpp:46
uavcan::BitSet::getByteNum
static std::size_t getByteNum(std::size_t bit_num)
Definition: bitset.hpp:23
uavcan::BitSet::operator!=
bool operator!=(const BitSet< NumBits > &rhs) const
Definition: bitset.hpp:160
test
Definition: dsdl/test.py:1
uavcan::BitSet::reset
BitSet< NumBits > & reset()
Definition: bitset.hpp:81
uavcan::BitSet::set
BitSet< NumBits > & set(std::size_t pos, bool val=true)
Definition: bitset.hpp:93
uavcan::BitSet::Reference::operator=
Reference & operator=(bool x)
Definition: bitset.hpp:52
uavcan::BitSet::getBitNum
static std::size_t getBitNum(const std::size_t bit_num)
Definition: bitset.hpp:25
uavcan::BitSet::operator[]
Reference operator[](std::size_t pos)
Definition: bitset.hpp:141
uavcan::BitSet::Reference
Definition: bitset.hpp:39
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::BitSet::Reference::operator=
Reference & operator=(const Reference &x)
Definition: bitset.hpp:58
uavcan::BitSet::operator=
BitSet< NumBits > & operator=(const BitSet< NumBits > &rhs)
Definition: bitset.hpp:147
build_config.hpp
uavcan::BitSet
Definition: bitset.hpp:19
uavcan::BitSet::data_
char data_[NumBytes]
Definition: bitset.hpp:36
uavcan::BitSet::size
std::size_t size() const
Definition: bitset.hpp:134
uavcan::BitSet::any
bool any() const
Definition: bitset.hpp:112
uavcan::BitSet::Reference::operator~
bool operator~() const
Definition: bitset.hpp:64
pyuavcan_v0.dsdl.signature.s
s
Definition: signature.py:73
uavcan::BitSet::Reference::parent_
BitSet *const parent_
Definition: bitset.hpp:43
uavcan::BitSet::operator==
bool operator==(const BitSet< NumBits > &rhs) const
Definition: bitset.hpp:161
uavcan::BitSet::set
BitSet< NumBits > & set()
Definition: bitset.hpp:87
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::BitSet::validatePos
static void validatePos(std::size_t &inout_pos)
Definition: bitset.hpp:27
pyuavcan_v0.driver.timestamp_estimator.x
x
Definition: timestamp_estimator.py:221
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
uavcan::BitSet::operator[]
bool operator[](std::size_t pos) const
Definition: bitset.hpp:136


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02