Skip to content

Commit fa0d4f6

Browse files
authored
Merge pull request diffblue#3185 from tautschnig/remove-member_offset_iterator
Remove member_offset_iterator
2 parents b16d247 + acb0a05 commit fa0d4f6

File tree

2 files changed

+18
-60
lines changed

2 files changed

+18
-60
lines changed

src/util/pointer_offset_size.cpp

Lines changed: 18 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -21,71 +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;
4542
bit_field_bits %= 8;
4643
}
4744
else if(comp.type().id() == ID_bool)
4845
{
4946
++bit_field_bits;
50-
current.second += bit_field_bits / 8;
47+
result += bit_field_bits / 8;
5148
bit_field_bits %= 8;
5249
}
5350
else
5451
{
5552
DATA_INVARIANT(
5653
bit_field_bits == 0, "padding ensures offset at byte boundaries");
57-
const typet &subtype=comp.type();
58-
59-
auto sub_size = pointer_offset_size(subtype, ns);
60-
54+
const auto sub_size = pointer_offset_size(comp.type(), ns);
6155
if(!sub_size.has_value())
62-
current.second=-1; // give up
56+
return {};
6357
else
64-
current.second += *sub_size;
58+
result += *sub_size;
6559
}
6660
}
67-
++current.first;
68-
return *this;
69-
}
7061

71-
optionalt<mp_integer> member_offset(
72-
const struct_typet &type,
73-
const irep_idt &member,
74-
const namespacet &ns)
75-
{
76-
const struct_typet::componentst &components=type.components();
77-
member_offset_iterator offsets(type, ns);
78-
79-
for(struct_typet::componentst::const_iterator
80-
it=components.begin();
81-
it!=components.end() && offsets->second!=-1;
82-
++it, ++offsets)
83-
{
84-
if(it->get_name()==member)
85-
break;
86-
}
87-
88-
return offsets->second;
62+
return result;
8963
}
9064

9165
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)