Skip to content

Commit 737f2ea

Browse files
committed
Remove member_offset_iterator
It was undocumented and its fields did't carry descriptive names, thus code using it was hard to read and understand. With all the preceding work it only had a single user left.
1 parent 827094b commit 737f2ea

File tree

2 files changed

+23
-59
lines changed

2 files changed

+23
-59
lines changed

src/util/pointer_offset_size.cpp

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -21,65 +21,45 @@ Author: Daniel Kroening, [email protected]
2121
#include "ssa_expr.h"
2222
#include "std_expr.h"
2323

24-
member_offset_iterator::member_offset_iterator(
25-
const struct_typet &_type,
26-
const namespacet &_ns):
27-
current({0, 0}),
28-
type(_type),
29-
ns(_ns),
30-
bit_field_bits(0)
24+
optionalt<mp_integer> member_offset(
25+
const struct_typet &type,
26+
const irep_idt &member,
27+
const namespacet &ns)
3128
{
32-
}
29+
mp_integer result = 0;
30+
std::size_t bit_field_bits = 0;
3331

34-
member_offset_iterator &member_offset_iterator::operator++()
35-
{
36-
if(current.second!=-1) // Already failed?
32+
for(const auto &comp : type.components())
3733
{
38-
const auto &comp=type.components()[current.first];
39-
if(comp.type().id()==ID_c_bit_field)
34+
if(comp.get_name() == member)
35+
return result;
36+
37+
if(comp.type().id() == ID_c_bit_field)
4038
{
41-
// take the extra bytes needed
42-
std::size_t w=to_c_bit_field_type(comp.type()).get_width();
39+
const std::size_t w = to_c_bit_field_type(comp.type()).get_width();
4340
bit_field_bits += w;
44-
current.second += bit_field_bits / 8;
41+
result += bit_field_bits / 8;
42+
bit_field_bits %= 8;
43+
}
44+
else if(comp.type().id() == ID_bool)
45+
{
46+
++bit_field_bits;
47+
result += bit_field_bits / 8;
4548
bit_field_bits %= 8;
4649
}
4750
else
4851
{
4952
DATA_INVARIANT(
5053
bit_field_bits == 0, "padding ensures offset at byte boundaries");
51-
const typet &subtype=comp.type();
52-
53-
auto sub_size = pointer_offset_size(subtype, ns);
54-
54+
const auto sub_size = pointer_offset_size(comp.type(), ns);
5555
if(!sub_size.has_value())
56-
current.second=-1; // give up
56+
return {};
5757
else
58-
current.second += *sub_size;
58+
result += *sub_size;
5959
}
6060
}
61-
++current.first;
62-
return *this;
63-
}
6461

65-
optionalt<mp_integer> member_offset(
66-
const struct_typet &type,
67-
const irep_idt &member,
68-
const namespacet &ns)
69-
{
70-
const struct_typet::componentst &components=type.components();
71-
member_offset_iterator offsets(type, ns);
72-
73-
for(struct_typet::componentst::const_iterator
74-
it=components.begin();
75-
it!=components.end() && offsets->second!=-1;
76-
++it, ++offsets)
77-
{
78-
if(it->get_name()==member)
79-
break;
80-
}
81-
82-
return offsets->second;
62+
return result;
8363
}
8464

8565
optionalt<mp_integer> member_offset_bits(

src/util/pointer_offset_size.h

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,6 @@ class constant_exprt;
2525

2626
// these return 'nullopt' on failure
2727

28-
// NOLINTNEXTLINE(readability/identifiers)
29-
class member_offset_iterator
30-
{
31-
typedef std::pair<size_t, mp_integer> refst;
32-
refst current;
33-
const struct_typet &type;
34-
const namespacet &ns;
35-
size_t bit_field_bits;
36-
public:
37-
member_offset_iterator(const struct_typet &_type,
38-
const namespacet &_ns);
39-
member_offset_iterator &operator++();
40-
const refst &operator*() const { return current; }
41-
const refst* operator->() const { return &current; }
42-
};
43-
4428
optionalt<mp_integer> member_offset(
4529
const struct_typet &type,
4630
const irep_idt &member,

0 commit comments

Comments
 (0)