+#define CTF_STREAM_SET_FIELD(ctf_stream, field) \
+ do { \
+ (ctf_stream)->field_mask |= CTF_STREAM_ ## field; \
+ } while (0)
+
+#define CTF_STREAM_FIELD_IS_SET(ctf_stream, field) \
+ ((ctf_stream)->field_mask & CTF_STREAM_ ## field)
+
+#define CTF_STREAM_GET_FIELD(ctf_stream, field) \
+ ({ \
+ assert(CTF_STREAM_FIELD_IS_SET(ctf_stream, field)); \
+ (ctf_stream)->(field); \
+ })
+
+struct ctf_stream_class {
+ struct ctf_trace *trace;
+ /* parent is lexical scope conaining the stream scope */
+ struct declaration_scope *declaration_scope;
+ /* innermost definition scope. to be used as parent of event. */
+ struct definition_scope *definition_scope;
+ GPtrArray *events_by_id; /* Array of struct ctf_event pointers indexed by id */
+ GHashTable *event_quark_to_id; /* GQuark to numeric id */
+
+ /* Declarations only used when parsing */
+ struct declaration_struct *packet_context_decl;
+ struct declaration_struct *event_header_decl;
+ struct declaration_struct *event_context_decl;
+
+ /* Definitions used afterward */
+ struct definition_struct *packet_context;
+ struct definition_struct *event_header;
+ struct definition_struct *event_context;