X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_model.hpp;h=6adf4c2a55d44a9d286c9ad84d0e376ebd8885fa;hb=b56e03d668d2db9c07aa9f9a7033b8bf205ee169;hp=e2c0519dda163f7db245d57d9049f480ff164524;hpb=19828970d2187334cae82f239f788b9f3a3912c6;p=apitrace diff --git a/trace_model.hpp b/trace_model.hpp index e2c0519..6adf4c2 100644 --- a/trace_model.hpp +++ b/trace_model.hpp @@ -23,6 +23,10 @@ * **************************************************************************/ +/* + * Object hierarchy for describing the traces in memory. + */ + #ifndef _TRACE_MODEL_HPP_ #define _TRACE_MODEL_HPP_ @@ -47,14 +51,15 @@ class UInt; class Value { public: + virtual ~Value() {} virtual void visit(Visitor &visitor) = 0; - operator bool (void) const; - operator signed long long (void) const; - operator unsigned long long (void) const; - operator double (void) const; + virtual operator bool (void) const = 0; + virtual operator signed long long (void) const; + virtual operator unsigned long long (void) const; + virtual operator double (void) const; - void *blob(void) const; + virtual void *blob(void) const; const char *string(void) const; inline operator signed char (void) const { @@ -100,17 +105,24 @@ public: class Null : public Value { public: + operator bool (void) const; + operator signed long long (void) const; + operator unsigned long long (void) const; + operator double (void) const; + void *blob(void) const; void visit(Visitor &visitor); }; -#undef Bool - class Bool : public Value { public: Bool(bool _value) : value(_value) {} + operator bool (void) const; + operator signed long long (void) const; + operator unsigned long long (void) const; + operator double (void) const; void visit(Visitor &visitor); bool value; @@ -122,6 +134,10 @@ class SInt : public Value public: SInt(signed long long _value) : value(_value) {} + operator bool (void) const; + operator signed long long (void) const; + operator unsigned long long (void) const; + operator double (void) const; void visit(Visitor &visitor); signed long long value; @@ -133,6 +149,10 @@ class UInt : public Value public: UInt(unsigned long long _value) : value(_value) {} + operator bool (void) const; + operator signed long long (void) const; + operator unsigned long long (void) const; + operator double (void) const; void visit(Visitor &visitor); unsigned long long value; @@ -144,6 +164,10 @@ class Float : public Value public: Float(double _value) : value(_value) {} + operator bool (void) const; + operator signed long long (void) const; + operator unsigned long long (void) const; + operator double (void) const; void visit(Visitor &visitor); double value; @@ -155,6 +179,7 @@ class String : public Value public: String(std::string _value) : value(_value) {} + operator bool (void) const; void visit(Visitor &visitor); std::string value; @@ -164,12 +189,17 @@ public: class Enum : public Value { public: - Enum(std::string &_name, Value *_value) : name(_name), value(_value) {} + typedef std::pair Signature; + + Enum(const Signature *_sig) : sig(_sig) {} + operator bool (void) const; + operator signed long long (void) const; + operator unsigned long long (void) const; + operator double (void) const; void visit(Visitor &visitor); - std::string name; - Value *value; + const Signature *sig; }; @@ -196,7 +226,9 @@ public: }; Struct(Signature *_sig) : sig(_sig), members(_sig->member_names.size()) { } + ~Struct(); + operator bool (void) const; void visit(Visitor &visitor); const Signature *sig; @@ -208,7 +240,9 @@ class Array : public Value { public: Array(size_t len) : values(len) {} + ~Array(); + operator bool (void) const; void visit(Visitor &visitor); std::vector values; @@ -223,10 +257,10 @@ public: buf = new char[_size]; } - ~Blob() { - delete [] buf; - } + ~Blob(); + operator bool (void) const; + void *blob(void) const; void visit(Visitor &visitor); size_t size; @@ -234,20 +268,32 @@ public: }; +class Pointer : public UInt +{ +public: + Pointer(unsigned long long value) : UInt(value) {} + + operator bool (void) const; + void *blob(void) const; + 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(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 +326,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;