Skip to content

Commit aa88e27

Browse files
authored
Merge pull request diffblue#1590 from reuk/reuk/numbering-api-update
Don't mutate parameters in numbering class, remove duplication in numbering classes
2 parents 161787b + bff25c5 commit aa88e27

File tree

6 files changed

+83
-133
lines changed

6 files changed

+83
-133
lines changed

src/analyses/custom_bitvector_analysis.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,10 @@ unsigned custom_bitvector_analysist::get_bit_nr(
181181
else if(string_expr.id()==ID_string_constant)
182182
{
183183
irep_idt value=string_expr.get(ID_value);
184-
return bits(value);
184+
return bits.number(value);
185185
}
186186
else
187-
return bits("(unknown)");
187+
return bits.number("(unknown)");
188188
}
189189

190190
std::set<exprt> custom_bitvector_analysist::aliases(

src/analyses/invariant_set.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@ bool inv_object_storet::get(const exprt &expr, unsigned &n)
5252
return false;
5353
}
5454

55-
return map.get_number(s, n);
55+
if(const auto number = map.get_number(s))
56+
{
57+
n = *number;
58+
return false;
59+
}
60+
return true;
5661
}
5762

5863
unsigned inv_object_storet::add(const exprt &expr)

src/solvers/flattening/boolbv_constant.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ bvt boolbvt::convert_constant(const constant_exprt &expr)
4848
else if(expr_type.id()==ID_string)
4949
{
5050
// we use the numbering for strings
51-
std::size_t number=string_numbering(expr.get_value());
51+
std::size_t number = string_numbering.number(expr.get_value());
5252
return bv_utils.build_constant(number, bv.size());
5353
}
5454
else if(expr_type.id()==ID_range)

src/solvers/flattening/boolbv_get.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -330,13 +330,14 @@ exprt boolbvt::bv_get_unbounded_array(const exprt &expr) const
330330
valuest values;
331331

332332
{
333-
std::size_t number;
334-
335-
if(arrays.get_number(expr, number))
333+
const auto opt_num = arrays.get_number(expr);
334+
if(!opt_num)
335+
{
336336
return nil_exprt();
337+
}
337338

338339
// get root
339-
number=arrays.find_number(number);
340+
const auto number = arrays.find_number(*opt_num);
340341

341342
assert(number<index_map.size());
342343
index_mapt::const_iterator it=index_map.find(number);

src/util/numbering.h

Lines changed: 61 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ Author: Daniel Kroening, [email protected]
66
77
\*******************************************************************/
88

9-
109
#ifndef CPROVER_UTIL_NUMBERING_H
1110
#define CPROVER_UTIL_NUMBERING_H
1211

@@ -16,154 +15,101 @@ Author: Daniel Kroening, [email protected]
1615
#include <vector>
1716

1817
#include <util/invariant.h>
18+
#include <util/optional.h>
1919

20-
template <typename T>
21-
// NOLINTNEXTLINE(readability/identifiers)
22-
class numbering final
20+
/// \tparam Map a map from a key type to some numeric type
21+
template <typename Map>
22+
class template_numberingt final
2323
{
2424
public:
25-
// NOLINTNEXTLINE(readability/identifiers)
26-
typedef std::size_t number_type;
25+
using number_type = typename Map::mapped_type; // NOLINT
26+
using key_type = typename Map::key_type; // NOLINT
2727

2828
private:
29-
typedef std::vector<T> data_typet;
30-
data_typet data;
31-
typedef std::map<T, number_type> numberst;
32-
numberst numbers;
29+
using data_typet = std::vector<key_type>; // NOLINT
30+
data_typet data_;
31+
Map numbers_;
3332

3433
public:
35-
// NOLINTNEXTLINE(readability/identifiers)
36-
typedef typename data_typet::size_type size_type;
37-
// NOLINTNEXTLINE(readability/identifiers)
38-
typedef typename data_typet::iterator iterator;
39-
// NOLINTNEXTLINE(readability/identifiers)
40-
typedef typename data_typet::const_iterator const_iterator;
41-
42-
number_type number(const T &a)
34+
using size_type = typename data_typet::size_type; // NOLINT
35+
using iterator = typename data_typet::iterator; // NOLINT
36+
using const_iterator = typename data_typet::const_iterator; // NOLINT
37+
38+
number_type number(const key_type &a)
4339
{
44-
std::pair<typename numberst::const_iterator, bool> result=
45-
numbers.insert(
46-
std::pair<T, number_type>
47-
(a, number_type(numbers.size())));
40+
const auto result = numbers_.emplace(a, number_type(numbers_.size()));
4841

4942
if(result.second) // inserted?
5043
{
51-
data.push_back(a);
52-
INVARIANT(data.size()==numbers.size(), "vector sizes must match");
44+
data_.emplace_back(a);
45+
INVARIANT(data_.size() == numbers_.size(), "vector sizes must match");
5346
}
5447

5548
return (result.first)->second;
5649
}
5750

58-
number_type operator()(const T &a)
51+
optionalt<number_type> get_number(const key_type &a) const
5952
{
60-
return number(a);
53+
const auto it = numbers_.find(a);
54+
if(it == numbers_.end())
55+
{
56+
return {};
57+
}
58+
return it->second;
6159
}
6260

63-
bool get_number(const T &a, number_type &n) const
61+
void clear()
6462
{
65-
typename numberst::const_iterator it=numbers.find(a);
66-
67-
if(it==numbers.end())
68-
return true;
69-
70-
n=it->second;
71-
return false;
63+
data_.clear();
64+
numbers_.clear();
7265
}
7366

74-
void clear()
67+
size_type size() const
7568
{
76-
data.clear();
77-
numbers.clear();
69+
return data_.size();
7870
}
7971

80-
size_t size() const { return data.size(); }
81-
82-
T &operator[](size_type t) { return data[t]; }
83-
const T &operator[](size_type t) const { return data[t]; }
84-
85-
iterator begin() { return data.begin(); }
86-
const_iterator begin() const { return data.begin(); }
87-
const_iterator cbegin() const { return data.cbegin(); }
88-
89-
iterator end() { return data.end(); }
90-
const_iterator end() const { return data.end(); }
91-
const_iterator cend() const { return data.cend(); }
92-
};
93-
94-
template <typename T, class hash_fkt>
95-
// NOLINTNEXTLINE(readability/identifiers)
96-
class hash_numbering final
97-
{
98-
public:
99-
// NOLINTNEXTLINE(readability/identifiers)
100-
typedef unsigned int number_type;
101-
102-
private:
103-
typedef std::vector<T> data_typet;
104-
data_typet data;
105-
typedef std::unordered_map<T, number_type, hash_fkt> numberst;
106-
numberst numbers;
107-
108-
public:
109-
// NOLINTNEXTLINE(readability/identifiers)
110-
typedef typename data_typet::size_type size_type;
111-
// NOLINTNEXTLINE(readability/identifiers)
112-
typedef typename data_typet::iterator iterator;
113-
// NOLINTNEXTLINE(readability/identifiers)
114-
typedef typename data_typet::const_iterator const_iterator;
115-
116-
number_type number(const T &a)
72+
key_type &operator[](size_type t)
11773
{
118-
std::pair<typename numberst::const_iterator, bool> result=
119-
numbers.insert(
120-
std::pair<T, number_type>
121-
(a, number_type(numbers.size())));
122-
123-
if(result.second) // inserted?
124-
{
125-
this->push_back(a);
126-
assert(this->size()==numbers.size());
127-
}
128-
129-
return (result.first)->second;
74+
return data_[t];
13075
}
131-
132-
bool get_number(const T &a, number_type &n) const
76+
const key_type &operator[](size_type t) const
13377
{
134-
typename numberst::const_iterator it=numbers.find(a);
135-
136-
if(it==numbers.end())
137-
return true;
138-
139-
n=it->second;
140-
return false;
78+
return data_[t];
14179
}
14280

143-
void clear()
81+
iterator begin()
14482
{
145-
data.clear();
146-
numbers.clear();
83+
return data_.begin();
84+
}
85+
const_iterator begin() const
86+
{
87+
return data_.begin();
88+
}
89+
const_iterator cbegin() const
90+
{
91+
return data_.cbegin();
14792
}
14893

149-
template <typename U>
150-
void push_back(U &&u) { data.push_back(std::forward<U>(u)); }
151-
152-
T &operator[](size_type t) { return data[t]; }
153-
const T &operator[](size_type t) const { return data[t]; }
154-
155-
T &at(size_type t) { return data.at(t); }
156-
const T &at(size_type t) const { return data.at(t); }
157-
158-
size_type size() const { return data.size(); }
94+
iterator end()
95+
{
96+
return data_.end();
97+
}
98+
const_iterator end() const
99+
{
100+
return data_.end();
101+
}
102+
const_iterator cend() const
103+
{
104+
return data_.cend();
105+
}
106+
};
159107

160-
iterator begin() { return data.begin(); }
161-
const_iterator begin() const { return data.begin(); }
162-
const_iterator cbegin() const { return data.cbegin(); }
108+
template <typename Key>
109+
using numbering = template_numberingt<std::map<Key, std::size_t>>; // NOLINT
163110

164-
iterator end() { return data.end(); }
165-
const_iterator end() const { return data.end(); }
166-
const_iterator cend() const { return data.cend(); }
167-
};
111+
template <typename Key, typename Hash>
112+
using hash_numbering = // NOLINT
113+
template_numberingt<std::unordered_map<Key, std::size_t, Hash>>;
168114

169115
#endif // CPROVER_UTIL_NUMBERING_H

src/util/union_find.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -168,16 +168,14 @@ class union_find final
168168
// are 'a' and 'b' in the same set?
169169
bool same_set(const T &a, const T &b) const
170170
{
171-
number_type na, nb;
172-
bool have_na=!numbers.get_number(a, na),
173-
have_nb=!numbers.get_number(b, nb);
171+
const optionalt<number_type> na = numbers.get_number(a);
172+
const optionalt<number_type> nb = numbers.get_number(a);
174173

175-
if(have_na && have_nb)
176-
return uuf.same_set(na, nb);
177-
else if(!have_na && !have_nb)
174+
if(na && nb)
175+
return uuf.same_set(*na, *nb);
176+
if(!na && !nb)
178177
return a==b;
179-
else
180-
return false;
178+
return false;
181179
}
182180

183181
// are 'a' and 'b' in the same set?
@@ -259,9 +257,9 @@ class union_find final
259257
uuf.isolate(number(a));
260258
}
261259

262-
bool get_number(const T &a, number_type &n) const
260+
optionalt<number_type> get_number(const T &a) const
263261
{
264-
return numbers.get_number(a, n);
262+
return numbers.get_number(a);
265263
}
266264

267265
size_t size() const { return numbers.size(); }

0 commit comments

Comments
 (0)