8 /* ensures fresh(result) /\ result' = { }; */
13 /* requires c^.activeIters = 0; */
15 /* ensures c' = { }; */
18 void erc_insert(erc c, eref er)
20 /* requires c^.activeIters = 0 /\ er \neq erefNIL; */
22 /* ensures c' = [insert(er, c^.val), 0]; */
25 bool erc_delete(erc c, eref er)
27 /* requires c^.activeIters = 0; */
29 /* ensures result = er \in c^.val
30 /\ c' = [delete(er, c^.val), 0]; */
33 bool erc_member(eref er, erc c)
35 /* ensures result = er \in c^.val; */
38 eref erc_choose(erc c)
40 /* requires size(c^.val) \neq 0; */
41 /* ensures result \in c^.val; */
46 /* ensures result = size(c^.val); */
49 ercIter erc_iterStart(erc c)
52 /* ensures fresh(result) /\ result' = [c^.val, c]
53 /\ c' = startIter(c^);
57 eref erc_yield(ercIter it)
59 modifies it; /* , it^.eObj */
60 /* ensures if it^.toYield \neq { }
61 then yielded(result, it^, it')
62 /\ (it^.eObj)' = (it^.eObj)^
63 else result = erefNIL /\ trashed(it)
64 /\ (it^.eObj)' = endIter((it^.eObj)^);
68 void erc_iterFinal(ercIter it)
70 modifies it; /* , it^.eObj; */
71 /* ensures trashed(it)
72 /\ (it^.eObj)' = endIter((it^.eObj)^);
76 void erc_join(erc c1, erc c2)
78 /* requires c1^.activeIters = 0; */
80 /* ensures c1' = [c1^.val \U c2^.val, 0]; */
83 char *erc_sprint(erc c)
85 /* ensures isSprint(result[]', c^) /\ fresh(result[]); */
91 /* ensures trashed(c); */
94 void erc_initMod(void)