Dune Core Modules (unstable)

bitsetvector.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 // SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
4 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5 #ifndef DUNE_BLOCK_BITFIELD_HH
6 #define DUNE_BLOCK_BITFIELD_HH
7 
12 #include <vector>
13 #include <bitset>
14 #include <iostream>
15 #include <algorithm>
16 
20 
21 namespace Dune {
22 
23  template <int block_size, class Alloc> class BitSetVector;
24  template <int block_size, class Alloc> class BitSetVectorReference;
25 
36  template <int block_size, class Alloc>
38  {
39  protected:
40 
42  friend class Dune::BitSetVector<block_size, Alloc>;
43 
44  BitSetVectorConstReference(const BitSetVector& blockBitField_, int block_number_) :
45  blockBitField(blockBitField_),
46  block_number(block_number_)
47  {
48  DUNE_ASSERT_BOUNDS(blockBitField_.size() > static_cast<size_t>(block_number_));
49  }
50 
53 
54  public:
55 
56  typedef std::bitset<block_size> bitset;
57 
58  // bitset interface typedefs
59  typedef typename std::vector<bool, Alloc>::const_reference reference;
60  typedef typename std::vector<bool, Alloc>::const_reference const_reference;
61  typedef size_t size_type;
62 
64  bitset operator<<(size_type n) const
65  {
66  bitset b = *this;
67  b <<= n;
68  return b;
69  }
70 
72  bitset operator>>(size_type n) const
73  {
74  bitset b = *this;
75  b >>= n;
76  return b;
77  }
78 
80  bitset operator~() const
81  {
82  bitset b = *this;
83  b.flip();
84  return b;
85  }
86 
88  size_type size() const
89  {
90  return block_size;
91  }
92 
94  size_type count() const
95  {
96  size_type n = 0;
97  for(size_type i=0; i<block_size; ++i)
98  n += getBit(i);
99  return n;
100  }
101 
103  bool any() const
104  {
105  return count();
106  }
107 
109  bool none() const
110  {
111  return ! any();
112  }
113 
115  bool all() const
116  {
117  for(size_type i=0; i<block_size; ++i)
118  if(not test(i))
119  return false;
120  return true;
121  }
122 
124  bool test(size_type n) const
125  {
126  return getBit(n);
127  }
128 
130  const_reference operator[](size_type i) const
131  {
132  return getBit(i);
133  }
134 
136  operator bitset() const
137  {
138  return blockBitField.getRepr(block_number);
139  }
140 
142  bool operator== (const bitset& bs) const
143  {
144  return equals(bs);
145  }
146 
149  {
150  return equals(bs);
151  }
152 
154  bool operator!= (const bitset& bs) const
155  {
156  return ! equals(bs);
157  }
158 
161  {
162  return ! equals(bs);
163  }
164 
171  friend std::ostream& operator<< (std::ostream& s, const BitSetVectorConstReference& v)
172  {
173  s << "(";
174  for(int i=0; i<block_size; ++i)
175  s << v[i];
176  s << ")";
177  return s;
178  }
179 
180  protected:
181  const BitSetVector& blockBitField;
182  int block_number;
183 
184  const_reference getBit(size_type i) const
185  {
186  return blockBitField.getBit(block_number,i);
187  }
188 
189  template<class BS>
190  bool equals(const BS & bs) const
191  {
192  bool eq = true;
193  for(int i=0; i<block_size; ++i)
194  eq &= (getBit(i) == bs[i]);
195  return eq;
196  }
197 
198  private:
203  void operator & () = delete;
204 
205  friend class BitSetVectorReference<block_size, Alloc>;
206  };
207 
220  template <int block_size, class Alloc>
221  class BitSetVectorReference : public BitSetVectorConstReference<block_size,Alloc>
222  {
223  protected:
224 
226  friend class Dune::BitSetVector<block_size, Alloc>;
227 
229 
230  BitSetVectorReference(BitSetVector& blockBitField_, int block_number_) :
231  BitSetVectorConstReference(blockBitField_, block_number_),
232  blockBitField(blockBitField_)
233  {}
234 
235  public:
236  typedef std::bitset<block_size> bitset;
237 
241  typedef typename std::vector<bool, Alloc>::reference reference;
243  typedef typename std::vector<bool, Alloc>::const_reference const_reference;
245 
247  typedef size_t size_type;
248 
251  {
252  for(int i=0; i<block_size; ++i)
253  getBit(i) = b;
254  return (*this);
255  }
256 
258  BitSetVectorReference& operator=(const bitset & b)
259  {
260  for(int i=0; i<block_size; ++i)
261  getBit(i) = b.test(i);
262  return (*this);
263  }
264 
267  {
268  for(int i=0; i<block_size; ++i)
269  getBit(i) = b.test(i);
270  return (*this);
271  }
272 
275  {
276  for(int i=0; i<block_size; ++i)
277  getBit(i) = b.test(i);
278  return (*this);
279  }
280 
283  {
284  for (size_type i=0; i<block_size; i++)
285  getBit(i) = (test(i) & x.test(i));
286  return *this;
287  }
288 
291  {
292  for (size_type i=0; i<block_size; i++)
293  getBit(i) = (test(i) & x.test(i));
294  return *this;
295  }
296 
299  {
300  for (size_type i=0; i<block_size; i++)
301  getBit(i) = (test(i) | x.test(i));
302  return *this;
303  }
304 
307  {
308  for (size_type i=0; i<block_size; i++)
309  getBit(i) = (test(i) | x.test(i));
310  return *this;
311  }
312 
315  {
316  for (size_type i=0; i<block_size; i++)
317  getBit(i) = (test(i) ^ x.test(i));
318  return *this;
319  }
320 
323  {
324  for (size_type i=0; i<block_size; i++)
325  getBit(i) = (test(i) ^ x.test(i));
326  return *this;
327  }
328 
331  {
332  for (size_type i=0; i<block_size-n; i++)
333  getBit(i) = test(i+n);
334  return *this;
335  }
336 
339  {
340  for (size_type i=0; i<block_size-n; i++)
341  getBit(i+n) = test(i);
342  return *this;
343  }
344 
347  {
348  for (size_type i=0; i<block_size; i++)
349  set(i);
350  return *this;
351  }
352 
355  {
356  for (size_type i=0; i<block_size; i++)
357  flip(i);
358  return *this;
359  }
360 
363  {
364  *this = false;
365  return *this;
366  }
367 
369  BitSetVectorReference& set(size_type n, int val = 1)
370  {
371  getBit(n) = val;
372  return *this;
373  }
374 
377  {
378  set(n, false);
379  return *this;
380  }
381 
384  {
385  getBit(n).flip();
386  return *this;
387  }
388 
390  using BitSetVectorConstReference::operator[];
391 
393  reference operator[](size_type i)
394  {
395  return getBit(i);
396  }
397 
398  protected:
399  BitSetVector& blockBitField;
400 
401  using BitSetVectorConstReference::getBit;
402 
403  reference getBit(size_type i)
404  {
405  return blockBitField.getBit(this->block_number,i);
406  }
407  };
408 
412  template<int block_size, class Alloc>
413  struct const_reference< BitSetVectorReference<block_size,Alloc> >
414  {
416  };
417 
418  template<int block_size, class Alloc>
419  struct const_reference< BitSetVectorConstReference<block_size,Alloc> >
420  {
422  };
423 
424  template<int block_size, class Alloc>
425  struct mutable_reference< BitSetVectorReference<block_size,Alloc> >
426  {
427  typedef BitSetVectorReference<block_size,Alloc> type;
428  };
429 
430  template<int block_size, class Alloc>
431  struct mutable_reference< BitSetVectorConstReference<block_size,Alloc> >
432  {
433  typedef BitSetVectorReference<block_size,Alloc> type;
434  };
435 
439  template <int block_size, class Allocator=std::allocator<bool> >
440  class BitSetVector : private std::vector<bool, Allocator>
441  {
443  typedef std::vector<bool, Allocator> BlocklessBaseClass;
444 
445  public:
448 
450  typedef std::bitset<block_size> value_type;
451 
454 
457 
460 
463 
465  typedef typename std::vector<bool, Allocator>::size_type size_type;
466 
468  typedef Allocator allocator_type;
470 
476 
479  return iterator(*this, 0);
480  }
481 
484  return const_iterator(*this, 0);
485  }
486 
489  return iterator(*this, size());
490  }
491 
493  const_iterator end() const {
494  return const_iterator(*this, size());
495  }
496 
499  BlocklessBaseClass()
500  {}
501 
503  BitSetVector(const BlocklessBaseClass& blocklessBitField) :
504  BlocklessBaseClass(blocklessBitField)
505  {
506  if (blocklessBitField.size()%block_size != 0)
507  DUNE_THROW(RangeError, "Vector size is not a multiple of the block size!");
508  }
509 
513  explicit BitSetVector(int n) :
514  BlocklessBaseClass(n*block_size)
515  {}
516 
518  BitSetVector(int n, bool v) :
519  BlocklessBaseClass(n*block_size,v)
520  {}
521 
523  void clear()
524  {
525  BlocklessBaseClass::clear();
526  }
527 
529  void resize(int n, bool v = bool())
530  {
531  BlocklessBaseClass::resize(n*block_size, v);
532  }
533 
535  size_type size() const
536  {
537  return BlocklessBaseClass::size()/block_size;
538  }
539 
541  void setAll() {
542  this->assign(BlocklessBaseClass::size(), true);
543  }
544 
546  void unsetAll() {
547  this->assign(BlocklessBaseClass::size(), false);
548  }
549 
552  {
553  return reference(*this, i);
554  }
555 
558  {
559  return const_reference(*this, i);
560  }
561 
564  {
565  return reference(*this, size()-1);
566  }
567 
570  {
571  return const_reference(*this, size()-1);
572  }
573 
575  size_type count() const
576  {
577  return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), true);
578  }
579 
581  size_type countmasked(int j) const
582  {
583  size_type n = 0;
584  size_type blocks = size();
585  for(size_type i=0; i<blocks; ++i)
586  n += getBit(i,j);
587  return n;
588  }
589 
591  friend std::ostream& operator<< (std::ostream& s, const BitSetVector& v)
592  {
593  for (size_t i=0; i<v.size(); i++)
594  s << v[i] << " ";
595  return s;
596  }
597 
598  private:
599 
601  value_type getRepr(int i) const
602  {
603  value_type bits;
604  for(int j=0; j<block_size; ++j)
605  bits.set(j, getBit(i,j));
606  return bits;
607  }
608 
609  typename std::vector<bool>::reference getBit(size_type i, size_type j) {
610  DUNE_ASSERT_BOUNDS(j < block_size);
611  DUNE_ASSERT_BOUNDS(i < size());
612  return BlocklessBaseClass::operator[](i*block_size+j);
613  }
614 
615  typename std::vector<bool>::const_reference getBit(size_type i, size_type j) const {
616  DUNE_ASSERT_BOUNDS(j < block_size);
617  DUNE_ASSERT_BOUNDS(i < size());
618  return BlocklessBaseClass::operator[](i*block_size+j);
619  }
620 
621  friend class BitSetVectorReference<block_size,Allocator>;
622  friend class BitSetVectorConstReference<block_size,Allocator>;
623  };
624 
625 } // namespace Dune
626 
627 #endif
Macro for wrapping boundary checks.
A proxy class that acts as a const reference to a single bitset in a BitSetVector.
Definition: bitsetvector.hh:38
bool operator==(const bitset &bs) const
Equality of reference and std::bitset.
Definition: bitsetvector.hh:142
bool test(size_type n) const
Returns true if bit n is set.
Definition: bitsetvector.hh:124
const_reference operator[](size_type i) const
Return reference to the i-th bit.
Definition: bitsetvector.hh:130
bitset operator<<(size_type n) const
Returns a copy of *this shifted left by n bits.
Definition: bitsetvector.hh:64
bitset operator>>(size_type n) const
Returns a copy of *this shifted right by n bits.
Definition: bitsetvector.hh:72
bool operator!=(const bitset &bs) const
Inequality of reference and std::bitset.
Definition: bitsetvector.hh:154
bool all() const
Returns true if all bits are set.
Definition: bitsetvector.hh:115
bitset operator~() const
Returns a copy of *this with all of its bits flipped.
Definition: bitsetvector.hh:80
size_type size() const
Returns block_size.
Definition: bitsetvector.hh:88
size_type count() const
Returns the number of bits that are set.
Definition: bitsetvector.hh:94
bool none() const
Returns true if no bits are set.
Definition: bitsetvector.hh:109
bool any() const
Returns true if any bits are set.
Definition: bitsetvector.hh:103
BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b)=delete
disable assignment operator
A proxy class that acts as a mutable reference to a single bitset in a BitSetVector.
Definition: bitsetvector.hh:222
BitSetVectorReference & operator=(const BitSetVectorReference &b)
Assignment from BitSetVectorReference.
Definition: bitsetvector.hh:274
bool test(size_type n) const
Returns true if bit n is set.
Definition: bitsetvector.hh:124
BitSetVectorReference & set()
Sets every bit.
Definition: bitsetvector.hh:346
reference operator[](size_type i)
Return reference to the i-th bit.
Definition: bitsetvector.hh:393
BitSetVectorReference & flip()
Flips the value of every bit.
Definition: bitsetvector.hh:354
std::vector< bool, Alloc >::const_reference const_reference
A proxy class that acts as a const reference to a single bit.
Definition: bitsetvector.hh:243
BitSetVectorReference & operator&=(const bitset &x)
Bitwise and (for bitset).
Definition: bitsetvector.hh:282
BitSetVectorReference & set(size_type n, int val=1)
Sets bit n if val is nonzero, and clears bit n if val is zero.
Definition: bitsetvector.hh:369
BitSetVectorReference & operator^=(const bitset &x)
Bitwise exclusive or (for bitset).
Definition: bitsetvector.hh:314
BitSetVectorReference & operator=(const BitSetVectorConstReference &b)
Assignment from BitSetVectorConstReference.
Definition: bitsetvector.hh:266
BitSetVectorReference & reset()
Clears every bit.
Definition: bitsetvector.hh:362
size_t size_type
size_type typedef (an unsigned integral type)
Definition: bitsetvector.hh:247
BitSetVectorReference & operator=(const bitset &b)
Assignment from bitset.
Definition: bitsetvector.hh:258
BitSetVectorReference & reset(size_type n)
Clears bit n.
Definition: bitsetvector.hh:376
BitSetVectorReference & operator|=(const BitSetVectorConstReference &x)
Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference)
Definition: bitsetvector.hh:306
std::vector< bool, Alloc >::reference reference
Definition: bitsetvector.hh:241
BitSetVectorReference & operator|=(const bitset &x)
Bitwise inclusive or (for bitset)
Definition: bitsetvector.hh:298
BitSetVectorReference & operator=(bool b)
Assignment from bool, sets each bit in the bitset to b.
Definition: bitsetvector.hh:250
BitSetVectorReference & operator^=(const BitSetVectorConstReference &x)
Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference)
Definition: bitsetvector.hh:322
BitSetVectorReference & operator&=(const BitSetVectorConstReference &x)
Bitwise and (for BitSetVectorConstReference and BitSetVectorReference)
Definition: bitsetvector.hh:290
BitSetVectorReference & operator<<=(size_type n)
Left shift.
Definition: bitsetvector.hh:330
BitSetVectorReference & flip(size_type n)
Flips bit n.
Definition: bitsetvector.hh:383
BitSetVectorReference & operator>>=(size_type n)
Right shift.
Definition: bitsetvector.hh:338
A dynamic array of blocks of booleans.
Definition: bitsetvector.hh:441
friend std::ostream & operator<<(std::ostream &s, const BitSetVector &v)
Send bitfield to an output stream.
Definition: bitsetvector.hh:591
std::vector< bool, Allocator >::size_type size_type
size type
Definition: bitsetvector.hh:465
const_reference operator[](int i) const
Return const reference to i-th block.
Definition: bitsetvector.hh:557
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition: bitsetvector.hh:478
BitSetVectorConstReference< block_size, Allocator > * const_pointer
Const pointer to a small block of bits.
Definition: bitsetvector.hh:462
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition: bitsetvector.hh:493
BitSetVectorReference< block_size, Allocator > reference
Reference to a small block of bits.
Definition: bitsetvector.hh:453
size_type countmasked(int j) const
Returns the number of set bits, while each block is masked with 1<<i.
Definition: bitsetvector.hh:581
BitSetVectorConstReference< block_size, Allocator > const_reference
Const reference to a small block of bits.
Definition: bitsetvector.hh:456
iterator end()
Returns an iterator pointing to the end of the vector.
Definition: bitsetvector.hh:488
size_type count() const
Returns the number of bits that are set.
Definition: bitsetvector.hh:575
BitSetVector()
Default constructor.
Definition: bitsetvector.hh:498
void setAll()
Sets all entries to true
Definition: bitsetvector.hh:541
std::bitset< block_size > value_type
Type of the values stored by the container.
Definition: bitsetvector.hh:450
reference back()
Return reference to last block.
Definition: bitsetvector.hh:563
BitSetVector(const BlocklessBaseClass &blocklessBitField)
Construction from an unblocked bitfield.
Definition: bitsetvector.hh:503
const_reference back() const
Return const reference to last block.
Definition: bitsetvector.hh:569
void clear()
Erases all of the elements.
Definition: bitsetvector.hh:523
BitSetVectorReference< block_size, Allocator > * pointer
Pointer to a small block of bits.
Definition: bitsetvector.hh:459
reference operator[](int i)
Return reference to i-th block.
Definition: bitsetvector.hh:551
size_type size() const
Return the number of blocks.
Definition: bitsetvector.hh:535
BitSetVector(int n, bool v)
Constructor which initializes the field with true or false.
Definition: bitsetvector.hh:518
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition: bitsetvector.hh:483
Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type, reference, std::ptrdiff_t, ForwardIteratorFacade > iterator
Definition: bitsetvector.hh:473
void resize(int n, bool v=bool())
Resize field.
Definition: bitsetvector.hh:529
Allocator allocator_type
The type of the allocator.
Definition: bitsetvector.hh:468
BitSetVector(int n)
Definition: bitsetvector.hh:513
void unsetAll()
Sets all entries to false
Definition: bitsetvector.hh:546
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:141
Generic class for stl-conforming iterators for container classes with operator[].
Definition: genericiterator.hh:153
Default exception class for range errors.
Definition: exceptions.hh:254
A few common exception classes.
Implements a generic iterator class for writing stl conformant iterators.
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
bool eq(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for equality using epsilon
Definition: float_cmp.cc:144
constexpr auto equals
Function object for performing equality comparison.
Definition: hybridutilities.hh:572
Dune namespace.
Definition: alignedallocator.hh:13
void assign(T &dst, const T &src, bool mask)
masked Simd assignment (scalar version)
Definition: simd.hh:447
Get the 'const' version of a reference to a mutable object.
Definition: genericiterator.hh:87
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 26, 22:29, 2024)