X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_model.hpp;h=6adf4c2a55d44a9d286c9ad84d0e376ebd8885fa;hb=b3733a82424232f601867ee20311d7d4242ef1a9;hp=71581e88e27a21a31844aec7f3102f33b90627f0;hpb=c6b49ce0258320f1981819f10c94c9c28a604b2b;p=apitrace diff --git a/trace_model.hpp b/trace_model.hpp index 71581e8..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,214 +51,256 @@ class UInt; class Value { public: - virtual void visit(Visitor &visitor) = 0; + 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; - const char *string(void) const; + virtual void *blob(void) const; + const char *string(void) const; - inline operator signed char (void) const { - return static_cast(*this); - } + inline operator signed char (void) const { + return static_cast(*this); + } - inline operator unsigned char (void) const { - return static_cast(*this); - } + inline operator unsigned char (void) const { + return static_cast(*this); + } - inline operator signed short (void) const { - return static_cast(*this); - } + inline operator signed short (void) const { + return static_cast(*this); + } - inline operator unsigned short (void) const { - return static_cast(*this); - } + inline operator unsigned short (void) const { + return static_cast(*this); + } - inline operator signed (void) const { - return static_cast(*this); - } + inline operator signed (void) const { + return static_cast(*this); + } - inline operator unsigned (void) const { - return static_cast(*this); - } + inline operator unsigned (void) const { + return static_cast(*this); + } - inline operator signed long (void) const { - return static_cast(*this); - } + inline operator signed long (void) const { + return static_cast(*this); + } - inline operator unsigned long (void) const { - return static_cast(*this); - } + inline operator unsigned long (void) const { + return static_cast(*this); + } - inline operator float (void) const { - return static_cast(*this); - } + inline operator float (void) const { + return static_cast(*this); + } - const Value & operator[](size_t index) const; + const Value & operator[](size_t index) const; }; class Null : public Value { public: - void visit(Visitor &visitor); + 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) {} + Bool(bool _value) : value(_value) {} - void visit(Visitor &visitor); + 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; + bool value; }; class SInt : public Value { public: - SInt(signed long long _value) : value(_value) {} + SInt(signed long long _value) : value(_value) {} - void visit(Visitor &visitor); + 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; + signed long long value; }; class UInt : public Value { public: - UInt(unsigned long long _value) : value(_value) {} + UInt(unsigned long long _value) : value(_value) {} - void visit(Visitor &visitor); + 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; + unsigned long long value; }; class Float : public Value { public: - Float(double _value) : value(_value) {} + Float(double _value) : value(_value) {} - void visit(Visitor &visitor); + 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; + double value; }; class String : public Value { public: - String(std::string _value) : value(_value) {} + String(std::string _value) : value(_value) {} - void visit(Visitor &visitor); + operator bool (void) const; + void visit(Visitor &visitor); - std::string value; + std::string value; }; class Enum : public Value { public: - Enum(std::string &_name, Value *_value) : name(_name), value(_value) {} + typedef std::pair Signature; - void visit(Visitor &visitor); + Enum(const Signature *_sig) : sig(_sig) {} - std::string name; - 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); + + const Signature *sig; }; class Bitmask : public UInt { public: - typedef std::pair Pair; - typedef std::vector Signature; + typedef std::pair Pair; + typedef std::vector Signature; - Bitmask(const Signature *_sig, unsigned long long _value) : UInt(_value), sig(_sig) {} + Bitmask(const Signature *_sig, unsigned long long _value) : UInt(_value), sig(_sig) {} - void visit(Visitor &visitor); + void visit(Visitor &visitor); - const Signature *sig; + const Signature *sig; }; class Struct : public Value { public: - struct Signature { - std::string name; - std::vector member_names; - }; + struct Signature { + std::string name; + std::vector member_names; + }; - Struct(Signature *_sig) : sig(_sig), members(_sig->member_names.size()) { } + Struct(Signature *_sig) : sig(_sig), members(_sig->member_names.size()) { } + ~Struct(); - void visit(Visitor &visitor); + operator bool (void) const; + void visit(Visitor &visitor); - const Signature *sig; - std::vector members; + const Signature *sig; + std::vector members; }; class Array : public Value { public: - Array(size_t len) : values(len) {} + Array(size_t len) : values(len) {} + ~Array(); - void visit(Visitor &visitor); + operator bool (void) const; + void visit(Visitor &visitor); - std::vector values; + std::vector values; }; class Blob : public Value { public: - Blob(size_t _size) { - size = _size; - buf = new char[_size]; - } + Blob(size_t _size) { + size = _size; + buf = new char[_size]; + } - ~Blob() { - delete [] buf; - } + ~Blob(); - void visit(Visitor &visitor); + operator bool (void) const; + void *blob(void) const; + void visit(Visitor &visitor); - size_t size; - char *buf; + size_t size; + char *buf; +}; + + +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) { - if (value) { - value->visit(*this); - } - } + inline void _visit(Value *value) { + if (value) { + value->visit(*this); + } + } }; @@ -269,25 +315,26 @@ double asFloat(const Value &node); class Call { public: - struct Signature { - std::string name; - std::vector arg_names; - }; - - unsigned no; - const Signature *sig; - std::vector args; - Value *ret; - - Call(Signature *_sig) : sig(_sig), args(_sig->arg_names.size()), ret(0) { } - - inline const std::string name(void) const { - return sig->name; - } - - inline Value & arg(unsigned index) { - return *(args[index]); - } + struct Signature { + std::string name; + std::vector arg_names; + }; + + unsigned no; + const Signature *sig; + std::vector args; + 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; + } + + inline Value & arg(unsigned index) { + return *(args[index]); + } };