| generic |
| package Predicate14 with |
| SPARK_Mode |
| is |
| |
| type Field_Type is (F_Initial, F_Payload, F_Final); |
| |
| type State_Type is (S_Valid, S_Invalid); |
| |
| type Cursor_Type (State : State_Type := S_Invalid) is private; |
| |
| type Cursors_Type is array (Field_Type) of Cursor_Type; |
| |
| type Context_Type is private; |
| |
| type Result_Type (Field : Field_Type := F_Initial) is |
| record |
| case Field is |
| when F_Initial | F_Final => |
| null; |
| when F_Payload => |
| Value : Integer; |
| end case; |
| end record; |
| |
| function Valid_Context (Context : Context_Type) return Boolean; |
| |
| private |
| |
| function Valid_Type (Result : Result_Type) return Boolean is |
| (Result.Field = F_Initial); |
| |
| type Cursor_Type (State : State_Type := S_Invalid) is |
| record |
| case State is |
| when S_Valid => |
| Value : Result_Type; |
| when S_Invalid => |
| null; |
| end case; |
| end record |
| with Dynamic_Predicate => |
| (if State = S_Valid then Valid_Type (Value)); |
| |
| type Context_Type is |
| record |
| Field : Field_Type := F_Initial; |
| Cursors : Cursors_Type := (others => (State => S_Invalid)); |
| end record; |
| |
| function Valid_Context (Context : Context_Type) return Boolean is |
| (for all F in Context.Cursors'Range => |
| (Context.Cursors (F).Value.Field = F)); |
| |
| procedure Dummy; |
| end Predicate14; |