index 039354d5b5c120737498795f9267a65babea13ca..a77febecbe6bb3514fc1a3b07e6a9ae8e835c858 100644 (file)
--- a/store.h
+++ b/store.h
#include <oberon.h>
#include <domain.h>
+#include <typeregister.h>
+#include <visitor.h>
#include <string>
#include <vector>
namespace odc {
+ class Reader; // forward decl
class TypePath : public std::vector<std::string> {
public:
*/
class Store {
private:
+ static const TopTypeProxy<Store> PROXY;
+
INTEGER d_id;
public:
+ static const std::string TYPENAME;
static const SHORTCHAR NEWBASE = 0xF0; // (* new base type (level = 0), i.e. not yet in dict *)
static const SHORTCHAR NEWEXT = 0xF1; // (* new extension type (level = 1), i.e. not yet in dict *)
static const SHORTCHAR OLDTYPE = 0xF2; // (* old type, i.e. already in dict *)
INTEGER getId();
+ /**
+ * Get the TypeName for this object.
+ */
+ virtual const std::string &getTypeName() const;
+ /**
+ * Get the TypePath to this object's type.
+ * @see TypePath
+ */
+ TypePath getTypePath() const;
/**
* PROCEDURE (s: Store) Domain (): Domain
* A store may be associated with a domain. This is done by the procedure InitDomain, which assigns a domain to the store.
* Domain may be called by arbitrary clients.
*/
- Domain* getDomain();
+ //Domain* getDomain();
/**
* PROCEDURE (s: Store) CopyFrom- (source: Store)
* source.Domain() = NIL guaranteed
* source is not yet initialized guaranteed
*/
-// void internalize(Reader &reader) {
+ virtual void internalize(Reader &reader);
// PROCEDURE (s: Store) Internalize- (VAR rd: Reader), NEW, EXTENSIBLE;
// VAR thisVersion: INTEGER;
// BEGIN
*/
// FIXME
- virtual std::string toString() = 0;
+ virtual std::string toString();
+
+ /**
+ * Receiving end of the Visitor pattern.
+ */
+ virtual void accept(Visitor &visitor) const;
+
+ private:
+ void calcTypePath(TypePath *out, const std::string &name) const;
};
+ class Elem : public Store {
+ private:
+ static const TypeProxy<Elem, Store> PROXY;
+
+ public:
+ static const std::string TYPENAME;
+ virtual const std::string &getTypeName() const;
+
+ Elem(INTEGER id);
+ virtual void internalize(Reader &reader);
+ };
+
+ class Model : public Elem {
+ private:
+ static const TypeProxy<Model, Elem> PROXY;
+
+ public:
+ static const std::string TYPENAME;
+ virtual const std::string &getTypeName() const;
+
+ Model(INTEGER id);
+ virtual void internalize(Reader &reader);
+ };
+
+ class ContainerModel : public Model {
+ private:
+ static const TypeProxy<ContainerModel, Model> PROXY;
+
+ public:
+ static const std::string TYPENAME;
+ virtual const std::string &getTypeName() const;
+
+ ContainerModel(INTEGER id);
+ virtual void internalize(Reader &reader);
+ };
}
#endif // _STORE_H_