21 bool no_change =
true;
27 auto &index = new_expr.
index();
28 auto &array = new_expr.array();
32 if(index.id() == ID_div)
37 index_div_expr.dividend().id() == ID_mult &&
38 index_div_expr.dividend().operands().size() == 2 &&
39 to_mult_expr(index_div_expr.dividend()).
op1() == index_div_expr.divisor())
46 index_div_expr.dividend().id() == ID_mult &&
47 index_div_expr.dividend().operands().size() == 2 &&
48 to_mult_expr(index_div_expr.dividend()).
op0() == index_div_expr.divisor())
56 if(array.id() == ID_array_comprehension)
62 if(index.type() == comprehension.arg().type())
64 exprt tmp = comprehension.body();
69 else if(array.id()==ID_with)
73 if(array.operands().size() != 3)
78 if(with_expr.where() == index)
81 return with_expr.new_value();
87 const exprt rhs_casted =
93 index_exprt(with_expr.old(), index, new_expr.type()));
97 return with_expr.new_value();
101 return new_index_expr;
104 if_exprt if_expr(equality_expr, with_expr.new_value(), new_index_expr);
109 array.id() == ID_constant || array.id() == ID_array ||
110 array.id() == ID_vector)
112 const auto i = numeric_cast<mp_integer>(index);
117 else if(*i < 0 || *i >= array.operands().size())
124 return array.operands()[numeric_cast_v<std::size_t>(*i)];
127 else if(array.id()==ID_string_constant)
129 const auto i = numeric_cast<mp_integer>(index);
136 else if(*i < 0 || *i > value.size())
144 (*i == value.size()) ? 0 : value[numeric_cast_v<std::size_t>(*i)];
148 else if(array.id()==ID_array_of)
152 else if(array.id() == ID_array_list)
155 for(
size_t i=0; i<array.operands().size()/2; i++)
161 return array.operands()[i * 2 + 1];
165 else if(array.id()==ID_byte_extract_little_endian ||
166 array.id()==ID_byte_extract_big_endian)
170 if(array.type().id() == ID_array || array.type().id() == ID_vector)
173 if(array.type().id() == ID_array)
182 if(!sub_size.has_value())
187 from_integer(*sub_size, byte_extract_expr.offset().type()),
189 index, byte_extract_expr.offset().type())});
193 auto result_expr = byte_extract_expr;
194 result_expr.type() = expr.
type();
195 result_expr.offset() = final_offset;
200 else if(array.id()==ID_if)
217 return std::move(new_expr);