]> git.cworth.org Git - apitrace/blobdiff - trace_model.hpp
Move Visitor::visit methods to .cpp; cleanup.
[apitrace] / trace_model.hpp
index e2c0519dda163f7db245d57d9049f480ff164524..90fa0f6da47987893c8424a3e137f349bee5a1fc 100644 (file)
  *
  **************************************************************************/
 
+/*
+ * Object hierarchy for describing the traces in memory.
+ */
+
 #ifndef _TRACE_MODEL_HPP_
 #define _TRACE_MODEL_HPP_
 
@@ -47,6 +51,7 @@ class UInt;
 class Value
 {
 public:
+    virtual ~Value() {}
     virtual void visit(Visitor &visitor) = 0;
 
     operator bool (void) const;
@@ -164,12 +169,13 @@ public:
 class Enum : public Value
 {
 public:
-    Enum(std::string &_name, Value *_value) : name(_name), value(_value) {}
+    typedef std::pair<std::string, Value *> Signature;
+
+    Enum(const Signature *_sig) : sig(_sig) {}
 
     void visit(Visitor &visitor);
 
-    std::string name;
-    Value *value;
+    const Signature *sig;
 };
 
 
@@ -196,6 +202,7 @@ public:
     };
 
     Struct(Signature *_sig) : sig(_sig), members(_sig->member_names.size()) { }
+    ~Struct();
 
     void visit(Visitor &visitor);
 
@@ -208,6 +215,7 @@ class Array : public Value
 {
 public:
     Array(size_t len) : values(len) {}
+    ~Array();
 
     void visit(Visitor &visitor);
 
@@ -223,9 +231,7 @@ public:
         buf = new char[_size];
     }
 
-    ~Blob() {
-        delete [] buf;
-    }
+    ~Blob();
 
     void visit(Visitor &visitor);
 
@@ -234,20 +240,30 @@ public:
 };
 
 
+class Pointer : public UInt
+{
+public:
+    Pointer(unsigned long long value) : UInt(value) {}
+
+    void visit(Visitor &visitor);
+};
+
+
 class Visitor
 {
 public:
-    virtual void visit(Null *) {assert(0);}
-    virtual void visit(Bool *) {assert(0);}
-    virtual void visit(SInt *) {assert(0);}
-    virtual void visit(UInt *) {assert(0);}
-    virtual void visit(Float *) {assert(0);}
-    virtual void visit(String *) {assert(0);}
-    virtual void visit(Enum *) {assert(0);}
-    virtual void visit(Bitmask *bitmask) {visit(static_cast<UInt *>(bitmask));}
-    virtual void visit(Struct *) {assert(0);}
-    virtual void visit(Array *) {assert(0);}
-    virtual void visit(Blob *) {assert(0);}
+    virtual void visit(Null *);
+    virtual void visit(Bool *);
+    virtual void visit(SInt *);
+    virtual void visit(UInt *);
+    virtual void visit(Float *);
+    virtual void visit(String *);
+    virtual void visit(Enum *);
+    virtual void visit(Bitmask *);
+    virtual void visit(Struct *);
+    virtual void visit(Array *);
+    virtual void visit(Blob *);
+    virtual void visit(Pointer *);
 
 protected:
     inline void _visit(Value *value) {
@@ -280,6 +296,7 @@ public:
     Value *ret;
 
     Call(Signature *_sig) : sig(_sig), args(_sig->arg_names.size()), ret(0) { }
+    ~Call();
 
     inline const std::string name(void) const {
         return sig->name;