Skip to content

Commit ce831a0

Browse files
Merge pull request #7764 from esteffin/esteffin/improve-c-enum-constructor
Improvement to c_enum_typet interface
2 parents 5d80835 + 2498769 commit ce831a0

File tree

4 files changed

+20
-9
lines changed

4 files changed

+20
-9
lines changed

src/ansi-c/c_typecheck_type.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,8 @@ void c_typecheck_baset::typecheck_c_enum_type(typet &type)
12701270
// we also track min and max to find a nice base type
12711271
mp_integer value=0, min_value=0, max_value=0;
12721272

1273-
std::list<c_enum_typet::c_enum_membert> enum_members;
1273+
std::vector<c_enum_typet::c_enum_membert> enum_members;
1274+
enum_members.reserve(as_expr.operands().size());
12741275

12751276
// We need to determine a width, and a signedness
12761277
// to obtain an 'underlying type'.
@@ -1413,14 +1414,11 @@ void c_typecheck_baset::typecheck_c_enum_type(typet &type)
14131414
enum_tag_symbol.is_file_local=true;
14141415
enum_tag_symbol.base_name=base_name;
14151416

1416-
// throw in the enum members as 'body'
1417-
irept::subt &body=enum_tag_symbol.type.add(ID_body).get_sub();
1418-
1419-
for(const auto &member : enum_members)
1420-
body.push_back(member);
1421-
14221417
enum_tag_symbol.type.add_subtype() = underlying_type;
14231418

1419+
// throw in the enum members as 'body'
1420+
to_c_enum_type(enum_tag_symbol.type).members() = std::move(enum_members);
1421+
14241422
// is it in the symbol table already?
14251423
symbolt *existing_symbol = symbol_table.get_writeable(identifier);
14261424

src/util/c_types.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,17 @@ class c_enum_typet : public type_with_subtypet
274274

275275
typedef std::vector<c_enum_membert> memberst;
276276

277+
c_enum_typet(typet _subtype, memberst enum_members)
278+
: c_enum_typet(std::move(_subtype))
279+
{
280+
members() = std::move(enum_members);
281+
}
282+
283+
memberst &members()
284+
{
285+
return reinterpret_cast<memberst &>(add(ID_body).get_sub());
286+
}
287+
277288
const memberst &members() const
278289
{
279290
return (const memberst &)(find(ID_body).get_sub());

unit/solvers/smt2_incremental/construct_value_expr_from_smt.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ static type_symbolt make_c_enum_type_symbol(std::size_t underlying_size)
3636
const signedbv_typet underlying_type{underlying_size};
3737
c_enum_typet enum_type{underlying_type};
3838

39-
auto &members = enum_type.add(ID_body).get_sub();
39+
auto &members = enum_type.members();
40+
members.reserve(20);
4041

4142
for(unsigned int i = 0; i < 20; ++i)
4243
{

unit/solvers/smt2_incremental/encoding/enum_encoding.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ static c_enum_typet make_c_enum_type(
1515
{
1616
c_enum_typet enum_type{underlying_type};
1717

18-
auto &members = enum_type.add(ID_body).get_sub();
18+
auto &members = enum_type.members();
19+
members.reserve(value_count);
1920

2021
for(unsigned int i = 0; i < value_count; ++i)
2122
{

0 commit comments

Comments
 (0)