DEADSOFTWARE

Add type handling (disabled until StdTextModel.internalize is implemented)
[odcread.git] / store.h
1 #ifndef _STORE_H_
2 #define _STORE_H_
4 #include <oberon.h>
5 #include <domain.h>
6 #include <typeregister.h>
8 #include <string>
9 #include <vector>
11 namespace odc {
12 class Reader; // forward decl
14 class TypePath : public std::vector<std::string> {
15 public:
16 std::string toString() const;
17 };
19 /**
20 * TYPE Store
21 * ABSTRACT
22 * Storable extensible data types like Views.View or TextModels.Text are derived from Store.
23 * Stores are typically allocated by suitable directories, e.g., Views.Directory or TextModels.Directory.
24 * Stores are used as base types for all objects that must be both extensible and persistent.
25 */
26 class Store {
27 private:
28 static const std::string TYPENAME;
29 static const TypeProxy<Store> PROXY;
30 static TypePath *s_typePath;
32 INTEGER d_id;
34 public:
35 static const SHORTCHAR NEWBASE = 0xF0; // (* new base type (level = 0), i.e. not yet in dict *)
36 static const SHORTCHAR NEWEXT = 0xF1; // (* new extension type (level = 1), i.e. not yet in dict *)
37 static const SHORTCHAR OLDTYPE = 0xF2; // (* old type, i.e. already in dict *)
38 static const SHORTCHAR NIL = 0x80; // (* nil store *)
39 static const SHORTCHAR LINK = 0x81; // (* link to another elem in same file *)
40 static const SHORTCHAR STORE = 0x82; // (* general store *)
41 static const SHORTCHAR ELEM = 0x83; // (* elem store *)
42 static const SHORTCHAR NEWLINK = 0x84; // (* link to another non-elem store in same file *)
44 Store(INTEGER id);
46 INTEGER getId();
48 /**
49 * Get the TypeName of this object.
50 * @see TypeRegister
51 */
52 static const std::string &getType();
53 /**
54 * Get the TypeName of the supertype of this object. Return 0 pointer if no supertype.
55 * @see TypeRegister
56 */
57 static const std::string *getSuper();
58 /**
59 * Get the TypeName for this object.
60 */
61 virtual const std::string &getTypeName() const;
62 /**
63 * Get the TypePath to this object's type.
64 * @see TypePath
65 */
66 const TypePath &getTypePath() const;
68 /**
69 * PROCEDURE (s: Store) Domain (): Domain
70 * NEW
71 * A store may be associated with a domain. This is done by the procedure InitDomain, which assigns a domain to the store.
72 * Domain may be called by arbitrary clients.
73 */
74 //Domain* getDomain();
76 /**
77 * PROCEDURE (s: Store) CopyFrom- (source: Store)
78 * NEW, EMPTY
79 * Copy the contents of source to s. Copying is a deep copy.
80 *
81 * Pre
82 * source # NIL guaranteed
83 * TYP(source) = TYP(s) guaranteed
84 * s.Domain() = NIL guaranteed
85 * s is not yet initialized guaranteed
86 */
87 // FIXME
88 /**
89 * PROCEDURE (s: Store) Internalize- (VAR rd: Reader)
90 * NEW, EMPTY
91 * (For backward compatibility, this method is actually still EXTENSIBLE. This may change in the future.)
92 * Reads the contents of s from reader rd. Internalize must read the same (amount of) data as is written by the corresponding Externalize procedure.
93 * Internalize is called locally.
94 * Internalize is extended by various persistent object types, e.g., models, views, and controllers.
95 *
96 * Pre
97 * source.Domain() = NIL guaranteed
98 * source is not yet initialized guaranteed
99 */
100 virtual void internalize(Reader &reader);
101 // PROCEDURE (s: Store) Internalize- (VAR rd: Reader), NEW, EXTENSIBLE;
102 // VAR thisVersion: INTEGER;
103 // BEGIN
104 // rd.ReadVersion(minVersion, maxStoreVersion, thisVersion);
105 // IF ~rd.cancelled & s.isElem THEN
106 // rd.ReadVersion(minVersion, maxStoreVersion, thisVersion)
107 // (* works since maxStoreVersion = maxElemVersion = 0 in pre-1.3 *)
108 // END
109 // END Internalize;
110 // }
112 /**
113 * PROCEDURE (s: Store) Externalize- (VAR wr: Writer)
114 * NEW, EMPTY
115 * (For backward compatibility, this method is actually still EXTENSIBLE. This may change in the future.)
116 * Write the contents of s to writer wr. Externalize must write the same (amount of) data as is read by the corresponding Internalize procedure.
117 * Externalize ist called locally.
118 * Externalize is extended by various persistent object types, e.g., models, views, and controllers.
119 */
120 // FIXME
122 /**
123 * PROCEDURE (s: Store) ExternalizeAs- (VAR s1: Store)
124 * NEW, EMPTY
125 * Before a store's Externalize procedure is called, its ExternalizeAs procedure is called, which gives the store the opportunity to denote another store that should be externalized in its place (a "proxy"). It is also possible to set s1 to NIL, which means that the store should not be externalized at all. This is used e.g. for compiler error markers, which are never stored.
126 * ExternalizeAs ist called locally.
127 *
128 * Pre
129 * s1 = s guaranteed
130 */
131 // FIXME
133 virtual std::string toString();
135 private:
136 TypePath *calcTypePath(const std::string &name) const;
137 };
139 class Elem : public Store {
140 private:
141 static const std::string TYPENAME;
142 static const TypeProxy<Elem> PROXY;
144 public:
145 Elem(INTEGER id);
147 /**
148 * Get the TypeName of this object.
149 * @see TypeRegister
150 */
151 static const std::string &getType();
152 /**
153 * Get the TypeName of the supertype of this object. Return 0 pointer if no supertype.
154 * @see TypeRegister
155 */
156 static const std::string *getSuper();
157 /**
158 * Get the TypeName for this object.
159 */
160 virtual const std::string &getTypeName() const;
162 virtual void internalize(Reader &reader);
163 };
165 class Model : public Elem {
166 private:
167 static const std::string TYPENAME;
168 static const TypeProxy<Model> PROXY;
170 public:
171 Model(INTEGER id);
173 /**
174 * Get the TypeName of this object.
175 * @see TypeRegister
176 */
177 static const std::string &getType();
178 /**
179 * Get the TypeName of the supertype of this object. Return 0 pointer if no supertype.
180 * @see TypeRegister
181 */
182 static const std::string *getSuper();
183 /**
184 * Get the TypeName for this object.
185 */
186 virtual const std::string &getTypeName() const;
188 virtual void internalize(Reader &reader);
189 };
191 class ContainerModel : public Model {
192 private:
193 static const std::string TYPENAME;
194 static const TypeProxy<ContainerModel> PROXY;
196 public:
197 ContainerModel(INTEGER id);
198 static const std::string &getType();
199 static const std::string *getSuper();
200 virtual const std::string &getTypeName() const;
201 virtual void internalize(Reader &reader);
202 };
204 class TextModel : public ContainerModel {
205 private:
206 static const std::string TYPENAME;
207 static const TypeProxy<TextModel> PROXY;
209 public:
210 TextModel(INTEGER id);
211 static const std::string &getType();
212 static const std::string *getSuper();
213 virtual const std::string &getTypeName() const;
214 virtual void internalize(Reader &reader);
215 };
217 class StdTextModel : public TextModel {
218 private:
219 static const std::string TYPENAME;
220 static const TypeProxy<StdTextModel> PROXY;
222 public:
223 StdTextModel(INTEGER id);
224 static const std::string &getType();
225 static const std::string *getSuper();
226 virtual const std::string &getTypeName() const;
227 virtual void internalize(Reader &reader);
228 };
231 #endif // _STORE_H_