@@ -1111,44 +1111,86 @@ static inline sva_if_exprt &to_sva_if_expr(exprt &expr)
11111111 return static_cast <sva_if_exprt &>(expr);
11121112}
11131113
1114- class sva_strong_exprt : public unary_exprt
1114+ // / Base class for sequence property expressions.
1115+ // / 1800-2017 16.12.2 Sequence property
1116+ class sva_sequence_property_expr_baset : public unary_predicate_exprt
1117+ {
1118+ public:
1119+ sva_sequence_property_expr_baset (irep_idt __id, exprt __op)
1120+ : unary_predicate_exprt(__id, std::move(__op))
1121+ {
1122+ }
1123+
1124+ const exprt &sequence () const
1125+ {
1126+ return op ();
1127+ }
1128+
1129+ exprt &sequence ()
1130+ {
1131+ return op ();
1132+ }
1133+
1134+ protected:
1135+ using unary_predicate_exprt::op;
1136+ };
1137+
1138+ inline const sva_sequence_property_expr_baset &
1139+ to_sva_sequence_property_expr_base (const exprt &expr)
1140+ {
1141+ sva_sequence_property_expr_baset::check (expr);
1142+ return static_cast <const sva_sequence_property_expr_baset &>(expr);
1143+ }
1144+
1145+ inline sva_sequence_property_expr_baset &
1146+ to_sva_sequence_property_base_expr (exprt &expr)
1147+ {
1148+ sva_sequence_property_expr_baset::check (expr);
1149+ return static_cast <sva_sequence_property_expr_baset &>(expr);
1150+ }
1151+
1152+ class sva_strong_exprt : public sva_sequence_property_expr_baset
11151153{
11161154public:
1117- sva_strong_exprt (exprt __op, typet __type )
1118- : unary_exprt (ID_sva_strong, std::move(__op), std::move(__type ))
1155+ sva_strong_exprt (exprt __op)
1156+ : sva_sequence_property_expr_baset (ID_sva_strong, std::move(__op))
11191157 {
11201158 }
11211159};
11221160
11231161inline const sva_strong_exprt &to_sva_strong_expr (const exprt &expr)
11241162{
1163+ PRECONDITION (expr.id () == ID_sva_strong);
11251164 sva_strong_exprt::check (expr);
11261165 return static_cast <const sva_strong_exprt &>(expr);
11271166}
11281167
11291168inline sva_strong_exprt &to_sva_strong_expr (exprt &expr)
11301169{
1170+ PRECONDITION (expr.id () == ID_sva_strong);
11311171 sva_strong_exprt::check (expr);
11321172 return static_cast <sva_strong_exprt &>(expr);
11331173}
11341174
1135- class sva_weak_exprt : public unary_exprt
1175+ class sva_weak_exprt : public sva_sequence_property_expr_baset
11361176{
11371177public:
1138- sva_weak_exprt (exprt __op, typet __type )
1139- : unary_exprt (ID_sva_weak, std::move(__op), std::move(__type ))
1178+ sva_weak_exprt (exprt __op)
1179+ : sva_sequence_property_expr_baset (ID_sva_weak, std::move(__op))
11401180 {
11411181 }
11421182};
11431183
11441184inline const sva_weak_exprt &to_sva_weak_expr (const exprt &expr)
11451185{
1186+ PRECONDITION (expr.id () == ID_sva_weak);
11461187 sva_weak_exprt::check (expr);
11471188 return static_cast <const sva_weak_exprt &>(expr);
11481189}
11491190
11501191inline sva_weak_exprt &to_sva_weak_expr (exprt &expr)
11511192{
1193+ PRECONDITION (expr.id () == ID_sva_weak);
11521194 sva_weak_exprt::check (expr);
11531195 return static_cast <sva_weak_exprt &>(expr);
11541196}
@@ -1517,11 +1559,11 @@ to_sva_sequence_first_match_expr(exprt &expr)
15171559
15181560// / 1800-2017 16.12.2 Sequence property
15191561// / Equivalent to weak(...) or strong(...) depending on context.
1520- class sva_sequence_property_exprt : public unary_predicate_exprt
1562+ class sva_sequence_property_exprt : public sva_sequence_property_expr_baset
15211563{
15221564public:
15231565 explicit sva_sequence_property_exprt (exprt op)
1524- : unary_predicate_exprt (ID_sva_sequence_property, std::move(op))
1566+ : sva_sequence_property_expr_baset (ID_sva_sequence_property, std::move(op))
15251567 {
15261568 }
15271569};
0 commit comments