Skip to content

Commit 1b4c3ac

Browse files
author
Daniel Kroening
committed
new constructors for code_blockt
The new constructors avoid building a vector from a list. The vector is constructed directly at the call site of the constructor.
1 parent 16d6934 commit 1b4c3ac

File tree

3 files changed

+22
-13
lines changed

3 files changed

+22
-13
lines changed

src/ansi-c/c_typecheck_code.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ void c_typecheck_baset::typecheck_decl(codet &code)
353353
else
354354
{
355355
// build a decl-block
356-
code_blockt code_block(new_code);
356+
auto code_block=code_blockt::from_list(new_code);
357357
code_block.set_statement(ID_decl_block);
358358
code.swap(code_block);
359359
}

src/ansi-c/c_typecheck_expr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr)
10101010
{
10111011
side_effect_exprt side_effect_expr(
10121012
ID_statement_expression, void_type(), expr.source_location());
1013-
code_blockt decl_block(clean_code);
1013+
auto decl_block=code_blockt::from_list(clean_code);
10141014
decl_block.set_statement(ID_decl_block);
10151015
side_effect_expr.copy_to_operands(decl_block);
10161016
clean_code.clear();
@@ -1067,7 +1067,7 @@ void c_typecheck_baset::typecheck_expr_typecast(exprt &expr)
10671067
{
10681068
side_effect_exprt side_effect_expr(
10691069
ID_statement_expression, void_type(), expr.source_location());
1070-
code_blockt decl_block(clean_code);
1070+
auto decl_block=code_blockt::from_list(clean_code);
10711071
decl_block.set_statement(ID_decl_block);
10721072
side_effect_expr.copy_to_operands(decl_block);
10731073
clean_code.clear();

src/util/std_code.h

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,24 @@ class code_blockt:public codet
117117
return (const code_operandst &)get_sub();
118118
}
119119

120-
explicit code_blockt(const std::list<codet> &_list):codet(ID_block)
120+
static code_blockt from_list(const std::list<codet> &_list)
121121
{
122-
auto &o = statements();
123-
reserve_operands(_list.size());
124-
for(std::list<codet>::const_iterator
125-
it=_list.begin();
126-
it!=_list.end();
127-
it++)
128-
o.push_back(*it);
122+
code_blockt result;
123+
statementst &s=result.statements();
124+
s.reserve(_list.size());
125+
for(const auto &c : _list)
126+
o.push_back(c);
127+
return result;
128+
}
129+
130+
explicit code_blockt(const std::vector<codet> &_statements):codet(ID_block)
131+
{
132+
operands()=(const std::vector<exprt> &)_statements;
133+
}
134+
135+
explicit code_blockt(std::vector<codet> &&_statements):codet(ID_block)
136+
{
137+
operands()=std::move((std::vector<exprt> &&)_statements);
129138
}
130139

131140
void move(codet &code)
@@ -166,9 +175,9 @@ class code_blockt:public codet
166175
const irep_idt &statement=last->get_statement();
167176

168177
if(statement==ID_block &&
169-
!last->operands().empty())
178+
!to_code_block(*last).statements().empty())
170179
{
171-
last=&to_code(last->operands().back());
180+
last=&to_code_block(*last).statements().back());
172181
}
173182
else if(statement==ID_label)
174183
{

0 commit comments

Comments
 (0)