22 bool no_change =
true;
28 auto &index = new_expr.
index();
29 auto &array = new_expr.array();
33 if(index.id() == ID_div)
38 index_div_expr.dividend().id() == ID_mult &&
39 index_div_expr.dividend().operands().size() == 2 &&
40 to_mult_expr(index_div_expr.dividend()).
op1() == index_div_expr.divisor())
47 index_div_expr.dividend().id() == ID_mult &&
48 index_div_expr.dividend().operands().size() == 2 &&
49 to_mult_expr(index_div_expr.dividend()).
op0() == index_div_expr.divisor())
57 if(array.id() == ID_array_comprehension)
63 if(index.type() == comprehension.arg().type())
65 exprt tmp = comprehension.body();
70 else if(array.id()==ID_with)
74 if(array.operands().size() != 3)
79 if(with_expr.where() == index)
82 return with_expr.new_value();
88 const exprt rhs_casted =
94 index_exprt(with_expr.old(), index, new_expr.type()));
98 return with_expr.new_value();
102 return new_index_expr;
105 if_exprt if_expr(equality_expr, with_expr.new_value(), new_index_expr);
110 array.id() == ID_constant || array.id() == ID_array ||
111 array.id() == ID_vector)
113 const auto i = numeric_cast<mp_integer>(index);
118 else if(*i < 0 || *i >= array.operands().size())
125 return array.operands()[numeric_cast_v<std::size_t>(*i)];
128 else if(array.id()==ID_string_constant)
130 const auto i = numeric_cast<mp_integer>(index);
137 else if(*i < 0 || *i > value.size())
145 (*i == value.size()) ? 0 : value[numeric_cast_v<std::size_t>(*i)];
149 else if(array.id()==ID_array_of)
153 else if(array.id() == ID_array_list)
156 for(
size_t i=0; i<array.operands().
size()/2; i++)
162 return array.operands()[i * 2 + 1];
166 else if(array.id()==ID_byte_extract_little_endian ||
167 array.id()==ID_byte_extract_big_endian)
171 if(array.type().id() == ID_array || array.type().id() == ID_vector)
174 if(array.type().id() == ID_array)
183 if(!sub_size.has_value())
188 from_integer(*sub_size, byte_extract_expr.offset().type()), index);
192 exprt result_expr(array.id(), expr.
type());
198 else if(array.id()==ID_if)
215 return std::move(new_expr);