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