Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
bit_vector.h
Go to the documentation of this file.
1#ifndef ROUTING_KIT_BIT_VECTOR_H
2#define ROUTING_KIT_BIT_VECTOR_H
3
4#include <stdint.h>
5#include <assert.h>
6#include <utility>
7
8namespace RoutingKit{
9
11public:
12 struct Uninitialized{};
13 static constexpr Uninitialized uninitialized = {};
14
15 BitVector();
16 BitVector(uint64_t size, Uninitialized);
17 explicit BitVector(uint64_t size, bool init_value = false);
18 ~BitVector();
19 BitVector(const BitVector&);
21
23 void swap(BitVector&);
24
25 bool empty()const { return size() == 0; }
26 uint64_t size()const { return size_; }
27
28 void resize(uint64_t size, Uninitialized);
29 void resize(uint64_t size, bool init_value = false);
30
31 void make_large_enough_for(uint64_t x, Uninitialized);
32 void make_large_enough_for(uint64_t x, bool init_value = false);
33
34 bool is_set(uint64_t x)const{
35 assert(x < size_ && "argument out of bounds");
36 uint64_t a = x/64;
37 uint64_t b = x%64;
38 uint64_t d = data_[a];
39 return d & (1ull << b);
40 }
41
42 void set(uint64_t x){
43 assert(x < size_ && "argument out of bounds");
44 uint64_t a = x/64;
45 uint64_t b = x%64;
46 uint64_t d = data_[a];
47 d |= (1ull << b);
48 data_[a] = d;
49 }
50
51 void set_if(uint64_t x, bool value){
52 assert(x < size_ && "argument out of bounds");
53 uint64_t a = x/64;
54 uint64_t b = x%64;
55 uint64_t d = data_[a];
56 d |= ((uint64_t)value << b);
57 data_[a] = d;
58 }
59
60 void set(uint64_t x, bool value){
61 assert(x < size_ && "argument out of bounds");
62 uint64_t a = x/64;
63 uint64_t b = x%64;
64 uint64_t d = data_[a];
65 d &= ~(1ull << b);
66 d |= ((uint64_t)value << b);
67 data_[a] = d;
68 }
69
70 void reset(uint64_t x){
71 assert(x < size_ && "argument out of bounds");
72 uint64_t a = x/64;
73 uint64_t b = x%64;
74 uint64_t d = data_[a];
75 d &= ~(1ull << b);
76 data_[a] = d;
77 }
78
79 void toggle(uint64_t x){
80 assert(x < size_ && "argument out of bounds");
81 uint64_t a = x/64;
82 uint64_t b = x%64;
83 uint64_t d = data_[a];
84 d ^= (1ull << b);
85 data_[a] = d;
86 }
87
88 void set_all();
89 void set_all(bool value);
90 void reset_all();
91
92 bool are_all_set()const;
93 bool is_any_set()const;
94
95 uint64_t population_count() const;
96
97 uint64_t count_true() const {return population_count();}
98 uint64_t count_false() const {return size()-population_count();}
99
100
104
105 void inplace_not();
106 BitVector operator~() const { BitVector v = *this; v.inplace_not(); return v; }
107
108 friend bool operator==(const BitVector&l, const BitVector&r);
109 friend bool operator<(const BitVector&l, const BitVector&r);
110
111 uint64_t*data(){return data_;}
112 const uint64_t*data()const{return data_;}
113
114 uint64_t uint512_count()const{ return (size_+511) / 512; }
115
117private:
118 uint64_t*data_;
119 uint64_t size_;
120};
121
122template<class F>
123inline BitVector make_bit_vector(uint64_t size, const F&f){
125 for(uint64_t x=0; x<size; ++x)
126 v.set(x, f(x));
127 return v;
128}
129
130// I envy the day where C++ finally gets rid of this error prone boilerplate.
131
132inline BitVector operator|(BitVector&&l, BitVector&&r) { l |= r; return std::move(l); }
133inline BitVector operator|(BitVector&&l, const BitVector&r) { l |= r; return std::move(l); }
134inline BitVector operator|(const BitVector&l, BitVector&&r) { r |= l; return std::move(r); }
135inline BitVector operator|(const BitVector&l, const BitVector&r) { BitVector x = l; x |= r; return x; }
136
137inline BitVector operator&(BitVector&&l, BitVector&&r) { l &= r; return std::move(l); }
138inline BitVector operator&(BitVector&&l, const BitVector&r) { l &= r; return std::move(l); }
139inline BitVector operator&(const BitVector&l, BitVector&&r) { r &= l; return std::move(r); }
140inline BitVector operator&(const BitVector&l, const BitVector&r) { BitVector x = l; x &= r; return x; }
141
142inline BitVector operator^(BitVector&&l, BitVector&&r) { l ^= r; return std::move(l); }
143inline BitVector operator^(BitVector&&l, const BitVector&r) { l ^= r; return std::move(l); }
144inline BitVector operator^(const BitVector&l, BitVector&&r) { r ^= l; return std::move(r); }
145inline BitVector operator^(const BitVector&l, const BitVector&r) { BitVector x = l; x ^= r; return x; }
146
147inline bool operator!=(const BitVector&l, const BitVector&r){ return !(l == r); }
148inline bool operator>(const BitVector&l, const BitVector&r){ return r < l; }
149inline bool operator<=(const BitVector&l, const BitVector&r){ return !(l > r); }
150inline bool operator>=(const BitVector&l, const BitVector&r){ return !(l < r); }
151
152} // namespace RoutingKit
153
154#endif
bool is_any_set() const
void swap(BitVector &)
void toggle(uint64_t x)
Definition bit_vector.h:79
void reset(uint64_t x)
Definition bit_vector.h:70
static constexpr Uninitialized uninitialized
Definition bit_vector.h:13
bool empty() const
Definition bit_vector.h:25
uint64_t uint512_count() const
Definition bit_vector.h:114
BitVector & operator&=(const BitVector &)
void set_if(uint64_t x, bool value)
Definition bit_vector.h:51
BitVector & operator=(BitVector)
friend bool operator<(const BitVector &l, const BitVector &r)
void set(uint64_t x)
Definition bit_vector.h:42
bool are_all_set() const
void set(uint64_t x, bool value)
Definition bit_vector.h:60
BitVector & operator|=(const BitVector &)
BitVector operator~() const
Definition bit_vector.h:106
uint64_t count_false() const
Definition bit_vector.h:98
uint64_t size() const
Definition bit_vector.h:26
void resize(uint64_t size, Uninitialized)
friend bool operator==(const BitVector &l, const BitVector &r)
const uint64_t * data() const
Definition bit_vector.h:112
BitVector & operator^=(const BitVector &)
uint64_t population_count() const
void make_large_enough_for(uint64_t x, Uninitialized)
uint64_t count_true() const
Definition bit_vector.h:97
bool is_set(uint64_t x) const
Definition bit_vector.h:34
BitVector operator^(BitVector &&l, BitVector &&r)
Definition bit_vector.h:142
BitVector operator|(BitVector &&l, BitVector &&r)
Definition bit_vector.h:132
BitVector operator&(BitVector &&l, BitVector &&r)
Definition bit_vector.h:137
bool operator>=(const BitVector &l, const BitVector &r)
Definition bit_vector.h:150
bool operator!=(const BitVector &l, const BitVector &r)
Definition bit_vector.h:147
bool operator>(const BitVector &l, const BitVector &r)
Definition bit_vector.h:148
BitVector make_bit_vector(uint64_t size, const F &f)
Definition bit_vector.h:123
bool operator<=(const BitVector &l, const BitVector &r)
Definition bit_vector.h:149