]> git.cworth.org Git - apitrace/blob - trace_model.hpp
Unify Call::Signature into FunctionSig.
[apitrace] / trace_model.hpp
1 /**************************************************************************
2  *
3  * Copyright 2010 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26 /*
27  * Object hierarchy for describing the traces in memory.
28  */
29
30 #ifndef _TRACE_MODEL_HPP_
31 #define _TRACE_MODEL_HPP_
32
33
34 #include <assert.h>
35
36 #include <map>
37 #include <list>
38 #include <vector>
39 #include <iostream>
40
41 #include "trace_writer.hpp"
42
43
44 namespace Trace {
45
46
47 class Visitor;
48
49
50 class Value
51 {
52 public:
53     virtual ~Value() {}
54     virtual void visit(Visitor &visitor) = 0;
55
56     virtual bool toBool(void) const = 0;
57     virtual signed long long toSInt(void) const;
58     virtual unsigned long long toUInt(void) const;
59     virtual float toFloat(void) const;
60     virtual double toDouble(void) const;
61
62     virtual void *toPointer(void) const;
63     virtual unsigned long long toUIntPtr(void) const;
64     virtual const char *toString(void) const;
65
66     const Value & operator[](size_t index) const;
67 };
68
69
70 class Null : public Value
71 {
72 public:
73     bool toBool(void) const;
74     signed long long toSInt(void) const;
75     unsigned long long toUInt(void) const;
76     virtual float toFloat(void) const;
77     virtual double toDouble(void) const;
78     void *toPointer(void) const;
79     unsigned long long toUIntPtr(void) const;
80     const char *toString(void) const;
81     void visit(Visitor &visitor);
82 };
83
84
85 class Bool : public Value
86 {
87 public:
88     Bool(bool _value) : value(_value) {}
89
90     bool toBool(void) const;
91     signed long long toSInt(void) const;
92     unsigned long long toUInt(void) const;
93     virtual float toFloat(void) const;
94     virtual double toDouble(void) const;
95     void visit(Visitor &visitor);
96
97     bool value;
98 };
99
100
101 class SInt : public Value
102 {
103 public:
104     SInt(signed long long _value) : value(_value) {}
105
106     bool toBool(void) const;
107     signed long long toSInt(void) const;
108     unsigned long long toUInt(void) const;
109     virtual float toFloat(void) const;
110     virtual double toDouble(void) const;
111     void visit(Visitor &visitor);
112
113     signed long long value;
114 };
115
116
117 class UInt : public Value
118 {
119 public:
120     UInt(unsigned long long _value) : value(_value) {}
121
122     bool toBool(void) const;
123     signed long long toSInt(void) const;
124     unsigned long long toUInt(void) const;
125     virtual float toFloat(void) const;
126     virtual double toDouble(void) const;
127     void visit(Visitor &visitor);
128
129     unsigned long long value;
130 };
131
132
133 class Float : public Value
134 {
135 public:
136     Float(double _value) : value(_value) {}
137
138     bool toBool(void) const;
139     signed long long toSInt(void) const;
140     unsigned long long toUInt(void) const;
141     virtual float toFloat(void) const;
142     virtual double toDouble(void) const;
143     void visit(Visitor &visitor);
144
145     double value;
146 };
147
148
149 class String : public Value
150 {
151 public:
152     String(const char * _value) : value(_value) {}
153
154     bool toBool(void) const;
155     const char *toString(void) const;
156     void visit(Visitor &visitor);
157
158     const char * value;
159 };
160
161
162 class Enum : public Value
163 {
164 public:
165     Enum(const EnumSig *_sig) : sig(_sig) {}
166
167     bool toBool(void) const;
168     signed long long toSInt(void) const;
169     unsigned long long toUInt(void) const;
170     virtual float toFloat(void) const;
171     virtual double toDouble(void) const;
172     void visit(Visitor &visitor);
173
174     const EnumSig *sig;
175 };
176
177
178 class Bitmask : public UInt
179 {
180 public:
181     Bitmask(const BitmaskSig *_sig, unsigned long long _value) : UInt(_value), sig(_sig) {}
182
183     void visit(Visitor &visitor);
184
185     const BitmaskSig *sig;
186 };
187
188
189 class Struct : public Value
190 {
191 public:
192     Struct(StructSig *_sig) : sig(_sig), members(_sig->num_members) { }
193     ~Struct();
194
195     bool toBool(void) const;
196     void visit(Visitor &visitor);
197
198     const StructSig *sig;
199     std::vector<Value *> members;
200 };
201
202
203 class Array : public Value
204 {
205 public:
206     Array(size_t len) : values(len) {}
207     ~Array();
208
209     bool toBool(void) const;
210     void visit(Visitor &visitor);
211
212     std::vector<Value *> values;
213 };
214
215
216 class Blob : public Value
217 {
218 public:
219     Blob(size_t _size) {
220         size = _size;
221         buf = new char[_size];
222     }
223
224     ~Blob();
225
226     bool toBool(void) const;
227     void *toPointer(void) const;
228     void visit(Visitor &visitor);
229
230     size_t size;
231     char *buf;
232 };
233
234
235 class Pointer : public UInt
236 {
237 public:
238     Pointer(unsigned long long value) : UInt(value) {}
239
240     bool toBool(void) const;
241     void *toPointer(void) const;
242     unsigned long long toUIntPtr(void) const;
243     void visit(Visitor &visitor);
244 };
245
246
247 class Visitor
248 {
249 public:
250     virtual void visit(Null *);
251     virtual void visit(Bool *);
252     virtual void visit(SInt *);
253     virtual void visit(UInt *);
254     virtual void visit(Float *);
255     virtual void visit(String *);
256     virtual void visit(Enum *);
257     virtual void visit(Bitmask *);
258     virtual void visit(Struct *);
259     virtual void visit(Array *);
260     virtual void visit(Blob *);
261     virtual void visit(Pointer *);
262
263 protected:
264     inline void _visit(Value *value) {
265         if (value) { 
266             value->visit(*this); 
267         }
268     }
269 };
270
271
272 std::ostream & operator <<(std::ostream &os, Value *value);
273
274
275 class Call
276 {
277 public:
278     unsigned no;
279     const FunctionSig *sig;
280     std::vector<Value *> args;
281     Value *ret;
282
283     Call(FunctionSig *_sig) : sig(_sig), args(_sig->num_args), ret(0) { }
284     ~Call();
285
286     inline const char * name(void) const {
287         return sig->name;
288     }
289
290     inline Value & arg(unsigned index) {
291         assert(index < args.size());
292         return *(args[index]);
293     }
294 };
295
296
297 std::ostream & operator <<(std::ostream &os, Call &call);
298
299
300 } /* namespace Trace */
301
302 #endif /* _TRACE_MODEL_HPP_ */