3 (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Models.odc *)
6 IMPORT Kernel, Stores, Sequencers;
9 minVersion = 0; maxVersion = 0;
11 clean* = Sequencers.clean;
12 notUndoable* = Sequencers.notUndoable;
13 invisible* = Sequencers.invisible;
16 Model* = POINTER TO ABSTRACT RECORD (Stores.Store)
17 era: INTEGER; (* stable era >= x *)
18 guard: INTEGER (* = TrapCount()+1 if model is addressee of ongoing broadcast *)
21 Context* = POINTER TO ABSTRACT RECORD END;
23 Proposal* = ABSTRACT RECORD END;
26 Message* = ABSTRACT RECORD
31 NeutralizeMsg* = RECORD (Message) END;
33 UpdateMsg* = EXTENSIBLE RECORD (Message) END;
36 VAR domainGuard: INTEGER; (* = TrapCount()+1 if domain is addressee of ongoing domaincast *)
41 PROCEDURE (m: Model) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE;
42 VAR thisVersion: INTEGER;
45 IF rd.cancelled THEN RETURN END;
46 rd.ReadVersion(minVersion, maxVersion, thisVersion)
49 PROCEDURE (m: Model) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE;
52 wr.WriteVersion(maxVersion)
58 PROCEDURE (c: Context) ThisModel* (): Model, NEW, ABSTRACT;
59 PROCEDURE (c: Context) Normalize* (): BOOLEAN, NEW, ABSTRACT;
60 PROCEDURE (c: Context) GetSize* (OUT w, h: INTEGER), NEW, ABSTRACT;
61 PROCEDURE (c: Context) SetSize* (w, h: INTEGER), NEW, EMPTY;
62 PROCEDURE (c: Context) MakeVisible* (l, t, r, b: INTEGER), NEW, EMPTY;
63 PROCEDURE (c: Context) Consider* (VAR p: Proposal), NEW, EMPTY;
68 PROCEDURE Era* (m: Model): INTEGER;
75 PROCEDURE CopyOf* (m: Model): Model;
78 RETURN Stores.CopyOf(m)(Model)
81 PROCEDURE BeginScript* (m: Model; name: Stores.OpName; OUT script: Stores.Operation);
82 (** post: (script # NIL) iff (m.domain # NIL) **)
86 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
88 WITH seq: Sequencers.Sequencer DO
89 seq.BeginScript(name, script)
96 PROCEDURE Do* (m: Model; name: Stores.OpName; op: Stores.Operation);
97 (** pre: m # NIL, op # NIL, ~op.inUse **)
100 ASSERT(m # NIL, 20); ASSERT(op # NIL, 21); (* ASSERT(~op.inUse, 22); *)
101 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
103 WITH seq: Sequencers.Sequencer DO
113 PROCEDURE LastOp* (m: Model): Stores.Operation;
118 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
120 WITH seq: Sequencers.Sequencer DO
130 PROCEDURE Bunch* (m: Model);
131 (** pre: m # NIL, m.Domain() # NIL **)
134 ASSERT(m # NIL, 20); ASSERT(m.Domain() # NIL, 21);
135 seq := m.Domain().GetSequencer();
136 ASSERT(seq # NIL, 22);
137 WITH seq: Sequencers.Sequencer DO
143 PROCEDURE StopBunching* (m: Model);
148 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
150 WITH seq: Sequencers.Sequencer DO
157 PROCEDURE EndScript* (m: Model; script: Stores.Operation);
158 (** pre: (script # NIL) iff (m.seq # NIL) **)
162 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
164 ASSERT(script # NIL, 21);
165 WITH seq: Sequencers.Sequencer DO
166 seq.EndScript(script)
168 ASSERT(script = NIL, 21)
171 ASSERT(script = NIL, 21)
176 PROCEDURE BeginModification* (type: INTEGER; m: Model);
181 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
183 WITH seq: Sequencers.Sequencer DO
184 seq.BeginModification(type, m)
188 END BeginModification;
190 PROCEDURE EndModification* (type: INTEGER; m: Model);
195 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
197 WITH seq: Sequencers.Sequencer DO
198 seq.EndModification(type, m)
204 PROCEDURE SetDirty* (m: Model);
209 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
211 WITH seq: Sequencers.Sequencer DO
218 PROCEDURE Domaincast* (d: Stores.Domain; VAR msg: Message);
219 VAR g: INTEGER; seq: ANYPTR;
222 seq := d.GetSequencer();
223 IF (seq # NIL) & (seq IS Sequencers.Sequencer) THEN
224 msg.model := NIL; msg.era := -1;
225 g := Kernel.trapCount + 1;
226 IF domainGuard > 0 THEN ASSERT(domainGuard # g, 20) END;
228 seq(Sequencers.Sequencer).Handle(msg);
234 PROCEDURE Broadcast* (m: Model; VAR msg: Message);
235 (** pre: model # NIL **)
236 (** post: model.era > model.era', msg.model = model, msg.era = model.era' + 1,
237 model.seq # NIL => msg sent to seq **)
238 VAR seq: ANYPTR; g: INTEGER;
242 IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
244 WITH seq: Sequencers.Sequencer DO
245 INC(m.era); msg.era := m.era;
246 g := Kernel.trapCount + 1;
247 IF m.guard > 0 THEN ASSERT(m.guard # g, 21) END;