Models.txt 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. MODULE Models;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Models.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT Kernel, Stores, Sequencers;
  5. CONST
  6. minVersion = 0; maxVersion = 0;
  7. clean* = Sequencers.clean;
  8. notUndoable* = Sequencers.notUndoable;
  9. invisible* = Sequencers.invisible;
  10. TYPE
  11. Model* = POINTER TO ABSTRACT RECORD (Stores.Store)
  12. era: INTEGER; (* stable era >= x *)
  13. guard: INTEGER (* = TrapCount()+1 if model is addressee of ongoing broadcast *)
  14. END;
  15. Context* = POINTER TO ABSTRACT RECORD END;
  16. Proposal* = ABSTRACT RECORD END;
  17. Message* = ABSTRACT RECORD
  18. model-: Model;
  19. era-: INTEGER
  20. END;
  21. NeutralizeMsg* = RECORD (Message) END;
  22. UpdateMsg* = EXTENSIBLE RECORD (Message) END;
  23. VAR domainGuard: INTEGER; (* = TrapCount()+1 if domain is addressee of ongoing domaincast *)
  24. (** Model **)
  25. PROCEDURE (m: Model) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE;
  26. VAR thisVersion: INTEGER;
  27. BEGIN
  28. m.Internalize^(rd);
  29. IF rd.cancelled THEN RETURN END;
  30. rd.ReadVersion(minVersion, maxVersion, thisVersion)
  31. END Internalize;
  32. PROCEDURE (m: Model) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE;
  33. BEGIN
  34. m.Externalize^(wr);
  35. wr.WriteVersion(maxVersion)
  36. END Externalize;
  37. (** Context **)
  38. PROCEDURE (c: Context) ThisModel* (): Model, NEW, ABSTRACT;
  39. PROCEDURE (c: Context) Normalize* (): BOOLEAN, NEW, ABSTRACT;
  40. PROCEDURE (c: Context) GetSize* (OUT w, h: INTEGER), NEW, ABSTRACT;
  41. PROCEDURE (c: Context) SetSize* (w, h: INTEGER), NEW, EMPTY;
  42. PROCEDURE (c: Context) MakeVisible* (l, t, r, b: INTEGER), NEW, EMPTY;
  43. PROCEDURE (c: Context) Consider* (VAR p: Proposal), NEW, EMPTY;
  44. (** miscellaneous **)
  45. PROCEDURE Era* (m: Model): INTEGER;
  46. BEGIN
  47. ASSERT(m # NIL, 20);
  48. RETURN m.era
  49. END Era;
  50. PROCEDURE CopyOf* (m: Model): Model;
  51. BEGIN
  52. ASSERT(m # NIL, 20);
  53. RETURN Stores.CopyOf(m)(Model)
  54. END CopyOf;
  55. PROCEDURE BeginScript* (m: Model; name: Stores.OpName; OUT script: Stores.Operation);
  56. (** post: (script # NIL) iff (m.domain # NIL) **)
  57. VAR seq: ANYPTR;
  58. BEGIN
  59. ASSERT(m # NIL, 20);
  60. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  61. IF seq # NIL THEN
  62. WITH seq: Sequencers.Sequencer DO
  63. seq.BeginScript(name, script)
  64. ELSE
  65. END
  66. ELSE script := NIL
  67. END
  68. END BeginScript;
  69. PROCEDURE Do* (m: Model; name: Stores.OpName; op: Stores.Operation);
  70. (** pre: m # NIL, op # NIL, ~op.inUse **)
  71. VAR seq: ANYPTR;
  72. BEGIN
  73. ASSERT(m # NIL, 20); ASSERT(op # NIL, 21); (* ASSERT(~op.inUse, 22); *)
  74. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  75. IF seq # NIL THEN
  76. WITH seq: Sequencers.Sequencer DO
  77. seq.Do(m, name, op)
  78. ELSE
  79. op.Do
  80. END
  81. ELSE
  82. op.Do
  83. END
  84. END Do;
  85. PROCEDURE LastOp* (m: Model): Stores.Operation;
  86. (** pre: m # NIL **)
  87. VAR seq: ANYPTR;
  88. BEGIN
  89. ASSERT(m # NIL, 20);
  90. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  91. IF seq # NIL THEN
  92. WITH seq: Sequencers.Sequencer DO
  93. RETURN seq.LastOp(m)
  94. ELSE
  95. RETURN NIL
  96. END
  97. ELSE
  98. RETURN NIL
  99. END
  100. END LastOp;
  101. PROCEDURE Bunch* (m: Model);
  102. (** pre: m # NIL, m.Domain() # NIL **)
  103. VAR seq: ANYPTR;
  104. BEGIN
  105. ASSERT(m # NIL, 20); ASSERT(m.Domain() # NIL, 21);
  106. seq := m.Domain().GetSequencer();
  107. ASSERT(seq # NIL, 22);
  108. WITH seq: Sequencers.Sequencer DO
  109. seq.Bunch(m)
  110. ELSE
  111. END
  112. END Bunch;
  113. PROCEDURE StopBunching* (m: Model);
  114. (** pre: m # NIL **)
  115. VAR seq: ANYPTR;
  116. BEGIN
  117. ASSERT(m # NIL, 20);
  118. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  119. IF seq # NIL THEN
  120. WITH seq: Sequencers.Sequencer DO
  121. seq.StopBunching
  122. ELSE
  123. END
  124. END
  125. END StopBunching;
  126. PROCEDURE EndScript* (m: Model; script: Stores.Operation);
  127. (** pre: (script # NIL) iff (m.seq # NIL) **)
  128. VAR seq: ANYPTR;
  129. BEGIN
  130. ASSERT(m # NIL, 20);
  131. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  132. IF seq # NIL THEN
  133. ASSERT(script # NIL, 21);
  134. WITH seq: Sequencers.Sequencer DO
  135. seq.EndScript(script)
  136. ELSE
  137. ASSERT(script = NIL, 21)
  138. END
  139. ELSE
  140. ASSERT(script = NIL, 21)
  141. END
  142. END EndScript;
  143. PROCEDURE BeginModification* (type: INTEGER; m: Model);
  144. (** pre: m # NIL **)
  145. VAR seq: ANYPTR;
  146. BEGIN
  147. ASSERT(m # NIL, 20);
  148. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  149. IF seq # NIL THEN
  150. WITH seq: Sequencers.Sequencer DO
  151. seq.BeginModification(type, m)
  152. ELSE
  153. END
  154. END
  155. END BeginModification;
  156. PROCEDURE EndModification* (type: INTEGER; m: Model);
  157. (** pre: m # NIL **)
  158. VAR seq: ANYPTR;
  159. BEGIN
  160. ASSERT(m # NIL, 20);
  161. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  162. IF seq # NIL THEN
  163. WITH seq: Sequencers.Sequencer DO
  164. seq.EndModification(type, m)
  165. ELSE
  166. END
  167. END
  168. END EndModification;
  169. PROCEDURE SetDirty* (m: Model);
  170. (** pre: m # NIL **)
  171. VAR seq: ANYPTR;
  172. BEGIN
  173. ASSERT(m # NIL, 20);
  174. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  175. IF seq # NIL THEN
  176. WITH seq: Sequencers.Sequencer DO
  177. seq.SetDirty(TRUE)
  178. ELSE
  179. END
  180. END
  181. END SetDirty;
  182. PROCEDURE Domaincast* (d: Stores.Domain; VAR msg: Message);
  183. VAR g: INTEGER; seq: ANYPTR;
  184. BEGIN
  185. IF d # NIL THEN
  186. seq := d.GetSequencer();
  187. IF (seq # NIL) & (seq IS Sequencers.Sequencer) THEN
  188. msg.model := NIL; msg.era := -1;
  189. g := Kernel.trapCount + 1;
  190. IF domainGuard > 0 THEN ASSERT(domainGuard # g, 20) END;
  191. domainGuard := g;
  192. seq(Sequencers.Sequencer).Handle(msg);
  193. domainGuard := 0
  194. END
  195. END
  196. END Domaincast;
  197. PROCEDURE Broadcast* (m: Model; VAR msg: Message);
  198. (** pre: model # NIL **)
  199. (** post: model.era > model.era', msg.model = model, msg.era = model.era' + 1,
  200. model.seq # NIL => msg sent to seq **)
  201. VAR seq: ANYPTR; g: INTEGER;
  202. BEGIN
  203. ASSERT(m # NIL, 20);
  204. msg.model := m;
  205. IF m.Domain() # NIL THEN seq := m.Domain().GetSequencer() ELSE seq := NIL END;
  206. IF seq # NIL THEN
  207. WITH seq: Sequencers.Sequencer DO
  208. INC(m.era); msg.era := m.era;
  209. g := Kernel.trapCount + 1;
  210. IF m.guard > 0 THEN ASSERT(m.guard # g, 21) END;
  211. m.guard := g;
  212. seq.Handle(msg);
  213. m.guard := 0
  214. ELSE
  215. END
  216. END
  217. END Broadcast;
  218. BEGIN
  219. domainGuard := 0
  220. END Models.