32 #ifndef DAL_BIT_VECTOR_H__
33 #define DAL_BIT_VECTOR_H__
58 typedef unsigned int bit_support;
59 static const bit_support WD_BIT = bit_support(CHAR_BIT*
sizeof(bit_support));
60 static const bit_support WD_MASK = WD_BIT - 1;
61 typedef dynamic_array<bit_support, 4> bit_container;
65 struct APIDECL bit_reference {
73 bit_reference(bit_support* x, bit_support m,
size_type y, bit_vector* z)
74 { p = x; ind = y; bv = z; mask = m; }
75 bit_reference(
void) {}
76 operator bool(
void)
const {
return (*p & mask) != 0; }
77 bit_reference& operator = (
bool x);
78 bit_reference& operator=(
const bit_reference& x)
79 {
return *
this = bool(x); }
81 {
return bool(*
this) == bool(x); }
82 bool operator<(
const bit_reference& x)
const
83 {
return bool(*
this) < bool(x); }
84 bool operator>(
const bit_reference& x)
const
85 {
return bool(*
this) > bool(x); }
86 bool operator>=(
const bit_reference& x)
const
87 {
return bool(*
this) >= bool(x); }
88 void flip(
void) {
if (
bool(*
this)) *
this =
false;
else *
this =
true; }
91 struct APIDECL bit_iterator {
92 typedef bool value_type;
93 typedef bit_reference reference;
94 typedef bit_reference* pointer;
96 typedef ptrdiff_t difference_type;
97 typedef std::random_access_iterator_tag iterator_category;
101 bit_container::iterator p;
104 inline void bump_up()
105 { ind++;
if (!(mask <<= 1)) { ++p; mask = 1;} }
106 inline void bump_down()
107 { ind--;
if (!(mask >>= 1)) { --p; mask = 1; mask <<= WD_MASK; } }
109 bit_iterator(
void) {}
110 bit_iterator(bit_vector &b,
size_type i);
111 reference operator*()
const
112 {
return reference(&(*p), mask, ind, bv); }
113 bit_iterator& operator++() { bump_up();
return *
this; }
114 bit_iterator operator++(
int)
115 { bit_iterator tmp=*
this; bump_up();
return tmp; }
116 bit_iterator& operator--() { bump_down();
return *
this; }
117 bit_iterator operator--(
int)
118 { bit_iterator tmp = *
this; bump_down();
return tmp; }
119 bit_iterator& operator+=(difference_type i);
120 bit_iterator& operator-=(difference_type i)
121 { *
this += -i;
return *
this; }
122 bit_iterator
operator+(difference_type i)
const
123 { bit_iterator tmp = *
this;
return tmp += i; }
124 bit_iterator
operator-(difference_type i)
const
125 { bit_iterator tmp = *
this;
return tmp -= i; }
126 difference_type
operator-(bit_iterator x)
const {
return ind - x.ind; }
127 reference operator[](difference_type i) {
return *(*
this + i); }
128 size_type index(
void)
const {
return ind; }
129 bool operator==(
const bit_iterator& x)
const {
return ind == x.ind; }
130 bool operator!=(
const bit_iterator& x)
const {
return ind != x.ind; }
131 bool operator<(bit_iterator x)
const {
return ind < x.ind; }
132 bool operator>(bit_iterator x)
const {
return ind > x.ind; }
133 bool operator>=(bit_iterator x)
const {
return ind >= x.ind; }
136 struct APIDECL bit_const_iterator {
137 typedef bool value_type;
138 typedef bool reference;
139 typedef const bool* pointer;
141 typedef ptrdiff_t difference_type;
142 typedef std::random_access_iterator_tag iterator_category;
146 bit_container::const_iterator p;
147 const bit_vector* bv;
149 inline void bump_up()
150 { ind++;
if (!(mask <<= 1)) { ++p; mask = 1;} }
151 inline void bump_down()
152 { ind--;
if (!(mask >>= 1)) { --p; mask = 1; mask <<= WD_MASK; } }
154 bit_const_iterator() {}
155 bit_const_iterator(
const bit_vector &b,
size_type i);
156 bit_const_iterator(
const bit_iterator& x)
157 : ind(x.ind), mask(x.mask), p(x.p), bv(x.bv) {}
158 reference operator*()
const {
return (*p & mask) != 0; }
159 bit_const_iterator& operator++() { bump_up();
return *
this; }
160 bit_const_iterator operator++(
int)
161 { bit_const_iterator tmp = *
this; bump_up();
return tmp; }
162 bit_const_iterator& operator--() { bump_down();
return *
this; }
163 bit_const_iterator operator--(
int)
164 { bit_const_iterator tmp = *
this; bump_down();
return tmp; }
165 bit_const_iterator& operator+=(difference_type i);
166 bit_const_iterator& operator-=(difference_type i)
167 { *
this += -i;
return *
this; }
168 bit_const_iterator
operator+(difference_type i)
const
169 { bit_const_iterator tmp = *
this;
return tmp += i; }
170 bit_const_iterator
operator-(difference_type i)
const
171 { bit_const_iterator tmp = *
this;
return tmp -= i; }
172 difference_type
operator-(bit_const_iterator x)
const {
return ind-x.ind; }
173 reference operator[](difference_type i) {
return *(*
this + i); }
174 size_type index(
void)
const {
return ind; }
175 bool operator==(
const bit_const_iterator& x)
const {
return ind == x.ind; }
176 bool operator!=(
const bit_const_iterator& x)
const {
return ind != x.ind; }
177 bool operator<(bit_const_iterator x)
const {
return ind < x.ind; }
178 bool operator>(bit_const_iterator x)
const {
return ind > x.ind; }
179 bool operator>=(bit_const_iterator x)
const {
return ind >= x.ind; }
183 class APIDECL bit_vector :
public bit_container {
186 typedef bool value_type;
188 typedef ptrdiff_t difference_type;
189 typedef bool const_reference;
190 typedef const bool* const_pointer;
191 typedef bit_reference reference;
192 typedef bit_reference* pointer;
193 typedef bit_iterator iterator;
194 typedef bit_const_iterator const_iterator;
198 mutable size_type ifirst_true, ilast_true;
199 mutable size_type ifirst_false, ilast_false;
201 mutable bool icard_valid;
208 ifirst_true = std::min(ifirst_true, i);
209 ilast_true = std::max(ilast_true, i);
213 ifirst_false = std::min(ifirst_false, i);
214 ilast_false = std::max(ilast_false, i);
218 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
219 typedef std::reverse_iterator<iterator> reverse_iterator;
220 size_type size(
void)
const {
return std::max(ilast_true, ilast_false)+1;}
222 iterator begin(
void) {
return iterator(*
this, 0); }
223 const_iterator begin(
void)
const {
return const_iterator(*
this, 0); }
224 iterator end(
void) {
return iterator(*
this, size()); }
225 const_iterator end(
void)
const {
return const_iterator(*
this, size()); }
227 reverse_iterator rbegin(
void) {
return reverse_iterator(end()); }
228 const_reverse_iterator rbegin(
void)
const
229 {
return const_reverse_iterator(end()); }
230 reverse_iterator rend(
void) {
return reverse_iterator(begin()); }
231 const_reverse_iterator rend(
void)
const
232 {
return const_reverse_iterator(begin()); }
235 {
return bit_container::capacity() * WD_BIT; }
238 reference front(
void) {
return *begin(); }
239 const_reference front(
void)
const {
return *begin(); }
240 reference back(
void) {
return *(end() - 1); }
241 const_reference back(
void)
const {
return *(end() - 1); }
244 const_reference operator [](
size_type ii)
const
245 {
return (ii >= size()) ? false : *const_iterator(*
this, ii); }
247 {
if (ii >= size()) fill_false(size(),ii);
return *iterator(*
this, ii);}
249 void swap(bit_vector &da);
252 icard = 0; icard_valid =
true;
253 ifirst_false = ilast_false = ifirst_true = ilast_true = 0;
258 reference r1 = (*this)[i1], r2 = (*this)[i2];
259 bool tmp = r1; r1 = r2; r2 = tmp;
263 return bit_container::memsize() +
sizeof(bit_vector)
264 -
sizeof(bit_container);
276 bit_vector &setminus(
const bit_vector &bv);
277 bit_vector &operator |=(
const bit_vector &bv);
278 bit_vector &operator &=(
const bit_vector &bv);
280 bit_vector operator |(
const bit_vector &bv)
const
281 { bit_vector r(*
this); r |= bv;
return r; }
282 bit_vector operator &(
const bit_vector &bv)
const
283 { bit_vector r(*
this); r &= bv;
return r; }
284 bool operator ==(
const bit_vector &bv)
const;
285 bool operator !=(
const bit_vector &bv)
const
286 {
return !((*this) == bv); }
288 bit_vector(
void) {
clear(); }
289 template <
size_t N> bit_vector(
const std::bitset<N> &bs) {
291 for (
size_type i=0; i < bs.size(); ++i) {
if (bs[i])
add(i); }
295 template <
typename ICONT> dal::bit_vector& merge_from(
const ICONT& c) {
296 for (
typename ICONT::const_iterator it = c.begin(); it != c.end(); ++it)
302 template <
typename IT> dal::bit_vector& merge_from(IT b, IT e) {
303 while (b != e) {
add(*b++); }
308 bool contains(
const dal::bit_vector &other)
const;
313 if (i < ifirst_true || i > ilast_true)
return false;
314 else return (((*(
const bit_container*)(
this))[i / WD_BIT]) &
315 (bit_support(1) << (i & WD_MASK))) ? true :
false; }
319 void sup(
size_type i) { (*this)[i] =
false; }
320 void del(
size_type i) { (*this)[i] =
false; }
324 int first(
void)
const {
return (card() == 0) ? -1 : int(first_true()); }
325 int last(
void)
const {
return (card() == 0) ? -1 : int(last_true()); }
326 inline int take_first(
void)
327 {
int res = first();
if (res >= 0) sup(res);
return res; }
328 inline int take_last(
void)
329 {
int res = last();
if (res >= 0) sup(res);
return res; }
347 class APIDECL bv_visitor {
349 bit_container::const_iterator it;
353 bv_visitor(
const dal::bit_vector& b) :
354 it(((const bit_container&)b).begin()+b.first()/WD_BIT),
355 ilast(b.last()+1), ind(b.first()), v(0) {
356 if (ind < ilast) { v = *it; v >>= (ind&WD_MASK); }
358 bool finished()
const {
return ind >= ilast; }
360 operator size_type()
const {
return ind; }
366 class APIDECL bv_visitor_c {
370 bv_visitor_c(
const dal::bit_vector& b) : bv(b), v(bv) {}
371 bool finished()
const {
return v.finished(); }
372 bool operator++() {
return ++v; }
378 inline int APIDECL &operator << (
int &i, bit_vector &s)
379 { i = s.take_first();
return i; }
380 inline const int APIDECL &operator >> (
const int &i, bit_vector &s)
381 { s.add(i);
return i; }
383 inline size_t APIDECL &operator << (
size_t &i, bit_vector &s)
384 { i = s.take_first();
return i; }
385 inline const size_t &operator >> (
const size_t &i, bit_vector &s)
386 { s.add(i);
return i; }
388 std::ostream APIDECL &operator <<(std::ostream &o,
const bit_vector &s);
391 template<
typename ITERABLE_BV>
392 class const_bv_iterator
398 typedef std::forward_iterator_tag iterator_category;
404 const_bv_iterator(
const ITERABLE_BV* p_iterable,
size_type pos)
405 : p_iterable_(const_cast<ITERABLE_BV*>(p_iterable)), pos_(pos)
408 bool operator!= (
const const_bv_iterator &other)
const{
409 return pos_ < other.pos_;
418 if (pos_ == other.pos_)
return 0;
420 auto &vector_this = p_iterable_->v_;
421 auto &vector_other = other.p_iterable_->v_;
422 bv_visitor v_this(vector_this), v_other(vector_other);
423 while (v_this < pos_) ++v_this;
424 while (v_other < other.pos_) ++v_other;
425 auto &v = (pos_ < other.pos_) ? v_this : v_other;
426 auto &v_end = (pos_ >= other.pos_) ? v_this : v_other;
429 while(v < v_end) { ++v; ++count;}
433 const const_bv_iterator &operator++(){
440 ITERABLE_BV *p_iterable_;
457 bv_iterable(
const bit_vector &v) : v_(v), visitor_(v){}
459 const_bv_iterator<bv_iterable> begin()
const;
460 const_bv_iterator<bv_iterable> end()
const;
461 inline bool operator++(){
return ++visitor_;};
465 const bit_vector& v_;
467 friend class const_bv_iterator<bv_iterable>;
474 bv_iterable_c(
const bit_vector &v) : v_(v), visitor_(v_){}
475 const_bv_iterator<bv_iterable_c> begin()
const;
476 const_bv_iterator<bv_iterable_c> end()
const;
477 inline bool operator++(){
return ++visitor_;};
483 friend class const_bv_iterator<bv_iterable_c>;
void clear(L &l)
clear (fill with zeros) a vector or matrix.
void add(const L1 &l1, L2 &l2)
*/
rational_fraction< T > operator-(const polynomial< T > &P, const rational_fraction< T > &Q)
Subtract Q from P.
rational_fraction< T > operator+(const polynomial< T > &P, const rational_fraction< T > &Q)
Add Q to P.
bool operator==(const pconvex_structure &p1, const pconvex_structure &p2)
Stored objects must be compared by keys, because there is a possibility that they are duplicated in s...
size_t size_type
used as the common size type in the library