1 #ifndef HAWKTRACER_EVENTS_H
2 #define HAWKTRACER_EVENTS_H
3 
4 #include <hawktracer/base_types.h>
5 #include <hawktracer/mkcreflect.h>
6 
7 #include <stddef.h>
8 
9 HT_DECLS_BEGIN
10 
11 typedef struct _HT_EventKlass HT_EventKlass;
12 
13 MKCREFLECT_DEFINE_STRUCT(HT_Event,
14                          (POINTER, HT_EventKlass*, klass),
15                          (INTEGER, HT_TimestampNs, timestamp),
16                          (INTEGER, HT_EventId, id))
17 
18 HT_API HT_EventKlass* ht_HT_Event_get_event_klass_instance(void);
19 HT_API HT_EventKlassId ht_HT_Event_register_event_klass(void);
20 HT_API size_t ht_HT_Event_get_size(HT_Event* event);
21 HT_API size_t ht_HT_Event_fnc_serialize(HT_Event* event, HT_Byte* buffer);
22 
23 #define HT_EVENT(event) ((HT_Event*)(event))
24 
25 struct _HT_EventKlass
26 {
27     MKCREFLECT_TypeInfo* type_info;
28     size_t (*serialize)(HT_Event* event, HT_Byte* buffer);
29     size_t (*get_size)(HT_Event* event);
30     HT_EventKlassId klass_id;
31 };
32 
33 #define HT_REGISTER_EVENT_KLASS(EVENT_TYPE) ht_##EVENT_TYPE##_register_event_klass()
34 
35 #define HT_EVENT_GET_KLASS(event) (((HT_Event*)event)->klass)
36 #define HT_EVENT_KLASS_GET(EVENT_TYPE) ht_##EVENT_TYPE##_get_event_klass_instance()
37 #define HT_EVENT_IS_INSTANCE_OF(event, EVENT_TYPE) \
38   (HT_EVENT_GET_KLASS(event) == HT_EVENT_KLASS_GET(EVENT_TYPE))
39 
40 #define HT_DECL_EVENT(TYPE_NAME, event) \
41     TYPE_NAME event; HT_EVENT(&event)->klass = HT_EVENT_KLASS_GET(TYPE_NAME);
42 
43 HT_DECLS_END
44 
45 #endif /* HAWKTRACER_EVENTS_H */
46