@@ -1059,4 +1059,115 @@ inline void validate_expr(const object_size_exprt &value)
10591059 " Object size expression must have pointer typed operand." );
10601060}
10611061
1062+ // / A predicate that indicates that the object pointed to is live
1063+ class live_object_exprt : public unary_predicate_exprt
1064+ {
1065+ public:
1066+ explicit live_object_exprt (exprt pointer)
1067+ : unary_predicate_exprt(ID_live_object, std::move(pointer))
1068+ {
1069+ PRECONDITION (as_const (*this ).pointer ().type ().id () == ID_pointer);
1070+ }
1071+
1072+ exprt &pointer ()
1073+ {
1074+ return op0 ();
1075+ }
1076+
1077+ const exprt &pointer () const
1078+ {
1079+ return op0 ();
1080+ }
1081+ };
1082+
1083+ template <>
1084+ inline bool can_cast_expr<live_object_exprt>(const exprt &base)
1085+ {
1086+ return base.id () == ID_live_object;
1087+ }
1088+
1089+ inline void validate_expr (const live_object_exprt &value)
1090+ {
1091+ validate_operands (value, 1 , " live_object must have one operand" );
1092+ }
1093+
1094+ // / \brief Cast an exprt to a \ref live_object_exprt
1095+ // /
1096+ // / \a expr must be known to be \ref live_object_exprt.
1097+ // /
1098+ // / \param expr: Source expression
1099+ // / \return Object of type \ref live_object_exprt
1100+ inline const live_object_exprt &to_live_object_expr (const exprt &expr)
1101+ {
1102+ PRECONDITION (expr.id () == ID_live_object);
1103+ const live_object_exprt &ret = static_cast <const live_object_exprt &>(expr);
1104+ validate_expr (ret);
1105+ return ret;
1106+ }
1107+
1108+ // / \copydoc to_live_object_expr(const exprt &)
1109+ inline live_object_exprt &to_live_object_expr (exprt &expr)
1110+ {
1111+ PRECONDITION (expr.id () == ID_live_object);
1112+ live_object_exprt &ret = static_cast <live_object_exprt &>(expr);
1113+ validate_expr (ret);
1114+ return ret;
1115+ }
1116+
1117+ // / A predicate that indicates that the object pointed to is writeable
1118+ class writeable_object_exprt : public unary_predicate_exprt
1119+ {
1120+ public:
1121+ explicit writeable_object_exprt (exprt pointer)
1122+ : unary_predicate_exprt(ID_writeable_object, std::move(pointer))
1123+ {
1124+ PRECONDITION (as_const (*this ).pointer ().type ().id () == ID_pointer);
1125+ }
1126+
1127+ exprt &pointer ()
1128+ {
1129+ return op0 ();
1130+ }
1131+
1132+ const exprt &pointer () const
1133+ {
1134+ return op0 ();
1135+ }
1136+ };
1137+
1138+ template <>
1139+ inline bool can_cast_expr<writeable_object_exprt>(const exprt &base)
1140+ {
1141+ return base.id () == ID_writeable_object;
1142+ }
1143+
1144+ inline void validate_expr (const writeable_object_exprt &value)
1145+ {
1146+ validate_operands (value, 1 , " writeable_object must have one operand" );
1147+ }
1148+
1149+ // / \brief Cast an exprt to a \ref writeable_object_exprt
1150+ // /
1151+ // / \a expr must be known to be \ref writeable_object_exprt.
1152+ // /
1153+ // / \param expr: Source expression
1154+ // / \return Object of type \ref writeable_object_exprt
1155+ inline const writeable_object_exprt &to_writeable_object_expr (const exprt &expr)
1156+ {
1157+ PRECONDITION (expr.id () == ID_writeable_object);
1158+ const writeable_object_exprt &ret =
1159+ static_cast <const writeable_object_exprt &>(expr);
1160+ validate_expr (ret);
1161+ return ret;
1162+ }
1163+
1164+ // / \copydoc to_writeable_object_expr(const exprt &)
1165+ inline writeable_object_exprt &to_writeable_object_expr (exprt &expr)
1166+ {
1167+ PRECONDITION (expr.id () == ID_writeable_object);
1168+ writeable_object_exprt &ret = static_cast <writeable_object_exprt &>(expr);
1169+ validate_expr (ret);
1170+ return ret;
1171+ }
1172+
10621173#endif // CPROVER_UTIL_POINTER_EXPR_H
0 commit comments