2 * Copyright (c) 2020-2021 Philippe Proulx <pproulx@efficios.com>
4 * SPDX-License-Identifier: MIT
7 #ifndef BABELTRACE_CPP_COMMON_BT2_TRACE_IR_HPP
8 #define BABELTRACE_CPP_COMMON_BT2_TRACE_IR_HPP
11 #include <type_traits>
13 #include <babeltrace2/babeltrace.h>
15 #include "cpp-common/bt2s/optional.hpp"
17 #include "borrowed-object.hpp"
18 #include "clock-class.hpp"
19 #include "field-class.hpp"
21 #include "internal/utils.hpp"
22 #include "optional-borrowed-object.hpp"
23 #include "shared-object.hpp"
28 template <typename LibObjT>
31 template <typename LibObjT>
34 template <typename LibObjT>
37 template <typename LibObjT>
40 template <typename LibObjT>
41 class CommonEventClass;
43 template <typename LibObjT>
44 class CommonStreamClass;
46 template <typename LibObjT>
47 class CommonTraceClass;
51 template <typename LibObjT>
52 struct CommonEventSpec;
54 /* Functions specific to mutable events */
56 struct CommonEventSpec<bt_event> final
58 static bt_event_class *cls(bt_event * const libObjPtr) noexcept
60 return bt_event_borrow_class(libObjPtr);
63 static bt_stream *stream(bt_event * const libObjPtr) noexcept
65 return bt_event_borrow_stream(libObjPtr);
68 static bt_packet *packet(bt_event * const libObjPtr) noexcept
70 return bt_event_borrow_packet(libObjPtr);
73 static bt_field *payloadField(bt_event * const libObjPtr) noexcept
75 return bt_event_borrow_payload_field(libObjPtr);
78 static bt_field *specificContextField(bt_event * const libObjPtr) noexcept
80 return bt_event_borrow_specific_context_field(libObjPtr);
83 static bt_field *commonContextField(bt_event * const libObjPtr) noexcept
85 return bt_event_borrow_common_context_field(libObjPtr);
89 /* Functions specific to constant events */
91 struct CommonEventSpec<const bt_event> final
93 static const bt_event_class *cls(const bt_event * const libObjPtr) noexcept
95 return bt_event_borrow_class_const(libObjPtr);
98 static const bt_stream *stream(const bt_event * const libObjPtr) noexcept
100 return bt_event_borrow_stream_const(libObjPtr);
103 static const bt_packet *packet(const bt_event * const libObjPtr) noexcept
105 return bt_event_borrow_packet_const(libObjPtr);
108 static const bt_field *payloadField(const bt_event * const libObjPtr) noexcept
110 return bt_event_borrow_payload_field_const(libObjPtr);
113 static const bt_field *specificContextField(const bt_event * const libObjPtr) noexcept
115 return bt_event_borrow_specific_context_field_const(libObjPtr);
118 static const bt_field *commonContextField(const bt_event * const libObjPtr) noexcept
120 return bt_event_borrow_common_context_field_const(libObjPtr);
124 template <typename LibObjT>
125 using DepStructField = DepType<LibObjT, StructureField, ConstStructureField>;
127 } /* namespace internal */
129 template <typename LibObjT>
130 class CommonEvent final : public BorrowedObject<LibObjT>
133 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
134 using _Spec = internal::CommonEventSpec<LibObjT>;
135 using _Packet = internal::DepPacket<LibObjT>;
136 using _Stream = internal::DepStream<LibObjT>;
137 using _StructureField = internal::DepStructField<LibObjT>;
140 using typename BorrowedObject<LibObjT>::LibObjPtr;
142 using Class = internal::DepType<LibObjT, CommonEventClass<bt_event_class>,
143 CommonEventClass<const bt_event_class>>;
145 explicit CommonEvent(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
149 template <typename OtherLibObjT>
150 CommonEvent(const CommonEvent<OtherLibObjT> event) noexcept : _ThisBorrowedObject {event}
154 template <typename OtherLibObjT>
155 CommonEvent<LibObjT> operator=(const CommonEvent<OtherLibObjT> event) noexcept
157 _ThisBorrowedObject::operator=(event);
161 CommonEvent<const bt_event> asConst() const noexcept
163 return CommonEvent<const bt_event> {*this};
166 Class cls() const noexcept;
167 _Stream stream() const noexcept;
168 OptionalBorrowedObject<_Packet> packet() const noexcept;
170 OptionalBorrowedObject<_StructureField> payloadField() const noexcept
172 return _Spec::payloadField(this->libObjPtr());
175 OptionalBorrowedObject<_StructureField> specificContextField() const noexcept
177 return _Spec::specificContextField(this->libObjPtr());
180 OptionalBorrowedObject<_StructureField> commonContextField() const noexcept
182 return _Spec::commonContextField(this->libObjPtr());
186 using Event = CommonEvent<bt_event>;
187 using ConstEvent = CommonEvent<const bt_event>;
191 struct EventTypeDescr
193 using Const = ConstEvent;
194 using NonConst = Event;
198 struct TypeDescr<Event> : public EventTypeDescr
203 struct TypeDescr<ConstEvent> : public EventTypeDescr
207 struct PacketRefFuncs final
209 static void get(const bt_packet * const libObjPtr) noexcept
211 bt_packet_get_ref(libObjPtr);
214 static void put(const bt_packet * const libObjPtr) noexcept
216 bt_packet_put_ref(libObjPtr);
220 template <typename LibObjT>
221 struct CommonPacketSpec;
223 /* Functions specific to mutable packets */
225 struct CommonPacketSpec<bt_packet> final
227 static bt_stream *stream(bt_packet * const libObjPtr) noexcept
229 return bt_packet_borrow_stream(libObjPtr);
232 static bt_field *contextField(bt_packet * const libObjPtr) noexcept
234 return bt_packet_borrow_context_field(libObjPtr);
238 /* Functions specific to constant packets */
240 struct CommonPacketSpec<const bt_packet> final
242 static const bt_stream *stream(const bt_packet * const libObjPtr) noexcept
244 return bt_packet_borrow_stream_const(libObjPtr);
247 static const bt_field *contextField(const bt_packet * const libObjPtr) noexcept
249 return bt_packet_borrow_context_field_const(libObjPtr);
253 } /* namespace internal */
255 template <typename LibObjT>
256 class CommonPacket final : public BorrowedObject<LibObjT>
259 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
260 using _Spec = internal::CommonPacketSpec<LibObjT>;
261 using _Stream = internal::DepStream<LibObjT>;
262 using _StructureField = internal::DepStructField<LibObjT>;
265 using typename BorrowedObject<LibObjT>::LibObjPtr;
266 using Shared = SharedObject<CommonPacket, LibObjT, internal::PacketRefFuncs>;
268 explicit CommonPacket(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
272 template <typename OtherLibObjT>
273 CommonPacket(const CommonPacket<OtherLibObjT> packet) noexcept : _ThisBorrowedObject {packet}
277 template <typename OtherLibObjT>
278 CommonPacket operator=(const CommonPacket<OtherLibObjT> packet) noexcept
280 _ThisBorrowedObject::operator=(packet);
284 CommonPacket<const bt_packet> asConst() const noexcept
286 return CommonPacket<const bt_packet> {*this};
289 _Stream stream() const noexcept;
291 OptionalBorrowedObject<_StructureField> contextField() const noexcept
293 return _Spec::contextField(this->libObjPtr());
296 Shared shared() const noexcept
298 return Shared::createWithRef(*this);
302 using Packet = CommonPacket<bt_packet>;
303 using ConstPacket = CommonPacket<const bt_packet>;
307 struct PacketTypeDescr
309 using Const = ConstPacket;
310 using NonConst = Packet;
314 struct TypeDescr<Packet> : public PacketTypeDescr
319 struct TypeDescr<ConstPacket> : public PacketTypeDescr
323 } /* namespace internal */
325 template <typename LibObjT>
326 OptionalBorrowedObject<typename CommonEvent<LibObjT>::_Packet>
327 CommonEvent<LibObjT>::packet() const noexcept
329 return _Spec::packet(this->libObjPtr());
334 struct StreamRefFuncs final
336 static void get(const bt_stream * const libObjPtr) noexcept
338 bt_stream_get_ref(libObjPtr);
341 static void put(const bt_stream * const libObjPtr) noexcept
343 bt_stream_put_ref(libObjPtr);
347 template <typename LibObjT>
348 struct CommonStreamSpec;
350 /* Functions specific to mutable streams */
352 struct CommonStreamSpec<bt_stream> final
354 static bt_stream_class *cls(bt_stream * const libObjPtr) noexcept
356 return bt_stream_borrow_class(libObjPtr);
359 static bt_trace *trace(bt_stream * const libObjPtr) noexcept
361 return bt_stream_borrow_trace(libObjPtr);
364 static bt_value *userAttributes(bt_stream * const libObjPtr) noexcept
366 return bt_stream_borrow_user_attributes(libObjPtr);
370 /* Functions specific to constant streams */
372 struct CommonStreamSpec<const bt_stream> final
374 static const bt_stream_class *cls(const bt_stream * const libObjPtr) noexcept
376 return bt_stream_borrow_class_const(libObjPtr);
379 static const bt_trace *trace(const bt_stream * const libObjPtr) noexcept
381 return bt_stream_borrow_trace_const(libObjPtr);
384 static const bt_value *userAttributes(const bt_stream * const libObjPtr) noexcept
386 return bt_stream_borrow_user_attributes_const(libObjPtr);
390 } /* namespace internal */
392 template <typename LibObjT>
393 class CommonStream final : public BorrowedObject<LibObjT>
396 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
397 using _Spec = internal::CommonStreamSpec<LibObjT>;
398 using _Trace = internal::DepType<LibObjT, CommonTrace<bt_trace>, CommonTrace<const bt_trace>>;
401 using typename BorrowedObject<LibObjT>::LibObjPtr;
402 using Shared = SharedObject<CommonStream, LibObjT, internal::StreamRefFuncs>;
403 using UserAttributes = internal::DepUserAttrs<LibObjT>;
405 using Class = internal::DepType<LibObjT, CommonStreamClass<bt_stream_class>,
406 CommonStreamClass<const bt_stream_class>>;
408 explicit CommonStream(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
412 template <typename OtherLibObjT>
413 CommonStream(const CommonStream<OtherLibObjT> stream) noexcept : _ThisBorrowedObject {stream}
417 template <typename OtherLibObjT>
418 CommonStream operator=(const CommonStream<OtherLibObjT> stream) noexcept
420 _ThisBorrowedObject::operator=(stream);
424 CommonStream<const bt_stream> asConst() const noexcept
426 return CommonStream<const bt_stream> {*this};
429 Packet::Shared createPacket() const
431 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstStream`.");
433 const auto libObjPtr = bt_packet_create(this->libObjPtr());
435 internal::validateCreatedObjPtr(libObjPtr);
436 return Packet::Shared::createWithoutRef(libObjPtr);
439 Class cls() const noexcept;
440 _Trace trace() const noexcept;
442 std::uint64_t id() const noexcept
444 return bt_stream_get_id(this->libObjPtr());
447 void name(const char * const name) const
449 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstStream`.");
451 const auto status = bt_stream_set_name(this->libObjPtr(), name);
453 if (status == BT_STREAM_SET_NAME_STATUS_MEMORY_ERROR) {
454 throw MemoryError {};
458 void name(const std::string& name) const
460 this->name(name.data());
463 const char *name() const noexcept
465 return bt_stream_get_name(this->libObjPtr());
468 template <typename LibValT>
469 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
471 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstStream`.");
473 bt_stream_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
476 UserAttributes userAttributes() const noexcept
478 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
481 Shared shared() const noexcept
483 return Shared::createWithRef(*this);
487 using Stream = CommonStream<bt_stream>;
488 using ConstStream = CommonStream<const bt_stream>;
492 struct StreamTypeDescr
494 using Const = ConstStream;
495 using NonConst = Stream;
499 struct TypeDescr<Stream> : public StreamTypeDescr
504 struct TypeDescr<ConstStream> : public StreamTypeDescr
508 } /* namespace internal */
510 template <typename LibObjT>
511 typename CommonEvent<LibObjT>::_Stream CommonEvent<LibObjT>::stream() const noexcept
513 return _Stream {_Spec::stream(this->libObjPtr())};
516 template <typename LibObjT>
517 typename CommonPacket<LibObjT>::_Stream CommonPacket<LibObjT>::stream() const noexcept
519 return _Stream {_Spec::stream(this->libObjPtr())};
524 struct TraceRefFuncs final
526 static void get(const bt_trace * const libObjPtr) noexcept
528 bt_trace_get_ref(libObjPtr);
531 static void put(const bt_trace * const libObjPtr) noexcept
533 bt_trace_put_ref(libObjPtr);
537 template <typename LibObjT>
538 struct CommonTraceSpec;
540 /* Functions specific to mutable traces */
542 struct CommonTraceSpec<bt_trace> final
544 static bt_trace_class *cls(bt_trace * const libObjPtr) noexcept
546 return bt_trace_borrow_class(libObjPtr);
549 static bt_stream *streamByIndex(bt_trace * const libObjPtr, const std::uint64_t index) noexcept
551 return bt_trace_borrow_stream_by_index(libObjPtr, index);
554 static bt_stream *streamById(bt_trace * const libObjPtr, const std::uint64_t id) noexcept
556 return bt_trace_borrow_stream_by_id(libObjPtr, id);
559 static bt_value *userAttributes(bt_trace * const libObjPtr) noexcept
561 return bt_trace_borrow_user_attributes(libObjPtr);
565 /* Functions specific to constant traces */
567 struct CommonTraceSpec<const bt_trace> final
569 static const bt_trace_class *cls(const bt_trace * const libObjPtr) noexcept
571 return bt_trace_borrow_class_const(libObjPtr);
574 static const bt_stream *streamByIndex(const bt_trace * const libObjPtr,
575 const std::uint64_t index) noexcept
577 return bt_trace_borrow_stream_by_index_const(libObjPtr, index);
580 static const bt_stream *streamById(const bt_trace * const libObjPtr,
581 const std::uint64_t id) noexcept
583 return bt_trace_borrow_stream_by_id_const(libObjPtr, id);
586 static const bt_value *userAttributes(const bt_trace * const libObjPtr) noexcept
588 return bt_trace_borrow_user_attributes_const(libObjPtr);
592 } /* namespace internal */
594 template <typename LibObjT>
595 class CommonTrace final : public BorrowedObject<LibObjT>
598 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
599 using _Spec = internal::CommonTraceSpec<LibObjT>;
600 using _Stream = internal::DepStream<LibObjT>;
603 using typename BorrowedObject<LibObjT>::LibObjPtr;
604 using Shared = SharedObject<CommonTrace, LibObjT, internal::TraceRefFuncs>;
605 using UserAttributes = internal::DepUserAttrs<LibObjT>;
607 using Class = internal::DepType<LibObjT, CommonTraceClass<bt_trace_class>,
608 CommonTraceClass<const bt_trace_class>>;
610 struct ConstEnvironmentEntry
616 explicit CommonTrace(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
620 template <typename OtherLibObjT>
621 CommonTrace(const CommonTrace<OtherLibObjT> trace) noexcept : _ThisBorrowedObject {trace}
625 template <typename OtherLibObjT>
626 CommonTrace operator=(const CommonTrace<OtherLibObjT> trace) noexcept
628 _ThisBorrowedObject::operator=(trace);
632 CommonTrace<const bt_trace> asConst() const noexcept
634 return CommonTrace<const bt_trace> {*this};
637 Class cls() const noexcept;
639 void name(const char * const name) const
641 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
643 const auto status = bt_trace_set_name(this->libObjPtr(), name);
645 if (status == BT_TRACE_SET_NAME_STATUS_MEMORY_ERROR) {
646 throw MemoryError {};
650 void name(const std::string& name) const
652 this->name(name.data());
655 const char *name() const noexcept
657 return bt_trace_get_name(this->libObjPtr());
660 void uuid(const bt2c::UuidView& uuid) const noexcept
662 bt_trace_set_uuid(this->libObjPtr(), uuid.begin());
665 bt2s::optional<bt2c::UuidView> uuid() const noexcept
667 const auto uuid = bt_trace_get_uuid(this->libObjPtr());
670 return bt2c::UuidView {uuid};
673 return bt2s::nullopt;
676 std::uint64_t length() const noexcept
678 return bt_trace_get_stream_count(this->libObjPtr());
681 _Stream operator[](const std::uint64_t index) const noexcept
683 return _Stream {_Spec::streamByIndex(this->libObjPtr(), index)};
686 OptionalBorrowedObject<_Stream> streamById(const std::uint64_t id) const noexcept
688 return _Spec::streamById(this->libObjPtr(), id);
691 void environmentEntry(const char * const name, const std::int64_t val) const
693 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
695 const auto status = bt_trace_set_environment_entry_integer(this->libObjPtr(), name, val);
697 if (status == BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR) {
698 throw MemoryError {};
702 void environmentEntry(const std::string& name, const std::int64_t val) const
704 this->environmentEntry(name.data(), val);
707 void environmentEntry(const char * const name, const char * const val) const
709 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
711 const auto status = bt_trace_set_environment_entry_string(this->libObjPtr(), name, val);
713 if (status == BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR) {
714 throw MemoryError {};
718 void environmentEntry(const std::string& name, const char * const val) const
720 this->environmentEntry(name.data(), val);
723 void environmentEntry(const char * const name, const std::string& val) const
725 this->environmentEntry(name, val.data());
728 void environmentEntry(const std::string& name, const std::string& val) const
730 this->environmentEntry(name.data(), val.data());
733 std::uint64_t environmentSize() const noexcept
735 return bt_trace_get_environment_entry_count(this->libObjPtr());
738 ConstEnvironmentEntry environmentEntry(const std::uint64_t index) const noexcept
741 const bt_value *libObjPtr;
743 bt_trace_borrow_environment_entry_by_index_const(this->libObjPtr(), index, &name,
745 return ConstEnvironmentEntry {name, ConstValue {libObjPtr}};
748 OptionalBorrowedObject<ConstValue> environmentEntry(const char * const name) const noexcept
750 return bt_trace_borrow_environment_entry_value_by_name_const(this->libObjPtr(), name);
753 OptionalBorrowedObject<ConstValue> environmentEntry(const std::string& name) const noexcept
755 return this->environmentEntry(name.data());
758 template <typename LibValT>
759 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
761 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
763 bt_trace_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
766 UserAttributes userAttributes() const noexcept
768 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
771 Shared shared() const noexcept
773 return Shared::createWithRef(*this);
777 using Trace = CommonTrace<bt_trace>;
778 using ConstTrace = CommonTrace<const bt_trace>;
782 struct TraceTypeDescr
784 using Const = ConstTrace;
785 using NonConst = Trace;
789 struct TypeDescr<Trace> : public TraceTypeDescr
794 struct TypeDescr<ConstTrace> : public TraceTypeDescr
798 } /* namespace internal */
800 template <typename LibObjT>
801 typename CommonStream<LibObjT>::_Trace CommonStream<LibObjT>::trace() const noexcept
803 return _Trace {_Spec::trace(this->libObjPtr())};
808 struct EventClassRefFuncs final
810 static void get(const bt_event_class * const libObjPtr) noexcept
812 bt_event_class_get_ref(libObjPtr);
815 static void put(const bt_event_class * const libObjPtr) noexcept
817 bt_event_class_put_ref(libObjPtr);
821 template <typename LibObjT>
822 struct CommonEventClassSpec;
824 /* Functions specific to mutable event classes */
826 struct CommonEventClassSpec<bt_event_class> final
828 static bt_stream_class *streamClass(bt_event_class * const libObjPtr) noexcept
830 return bt_event_class_borrow_stream_class(libObjPtr);
833 static bt_field_class *payloadFieldClass(bt_event_class * const libObjPtr) noexcept
835 return bt_event_class_borrow_payload_field_class(libObjPtr);
838 static bt_field_class *specificContextFieldClass(bt_event_class * const libObjPtr) noexcept
840 return bt_event_class_borrow_specific_context_field_class(libObjPtr);
843 static bt_value *userAttributes(bt_event_class * const libObjPtr) noexcept
845 return bt_event_class_borrow_user_attributes(libObjPtr);
849 /* Functions specific to constant event classes */
851 struct CommonEventClassSpec<const bt_event_class> final
853 static const bt_stream_class *streamClass(const bt_event_class * const libObjPtr) noexcept
855 return bt_event_class_borrow_stream_class_const(libObjPtr);
858 static const bt_field_class *payloadFieldClass(const bt_event_class * const libObjPtr) noexcept
860 return bt_event_class_borrow_payload_field_class_const(libObjPtr);
863 static const bt_field_class *
864 specificContextFieldClass(const bt_event_class * const libObjPtr) noexcept
866 return bt_event_class_borrow_specific_context_field_class_const(libObjPtr);
869 static const bt_value *userAttributes(const bt_event_class * const libObjPtr) noexcept
871 return bt_event_class_borrow_user_attributes_const(libObjPtr);
875 template <typename LibObjT>
876 using DepStructFc = DepType<LibObjT, StructureFieldClass, ConstStructureFieldClass>;
878 } /* namespace internal */
880 template <typename LibObjT>
881 class CommonEventClass final : public BorrowedObject<LibObjT>
884 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
885 using _Spec = internal::CommonEventClassSpec<LibObjT>;
886 using _StructureFieldClass = internal::DepStructFc<LibObjT>;
888 using _StreamClass = internal::DepType<LibObjT, CommonStreamClass<bt_stream_class>,
889 CommonStreamClass<const bt_stream_class>>;
892 using typename BorrowedObject<LibObjT>::LibObjPtr;
893 using Shared = SharedObject<CommonEventClass, LibObjT, internal::EventClassRefFuncs>;
894 using UserAttributes = internal::DepUserAttrs<LibObjT>;
898 EMERGENCY = BT_EVENT_CLASS_LOG_LEVEL_EMERGENCY,
899 ALERT = BT_EVENT_CLASS_LOG_LEVEL_ALERT,
900 CRITICAL = BT_EVENT_CLASS_LOG_LEVEL_CRITICAL,
901 ERR = BT_EVENT_CLASS_LOG_LEVEL_ERROR,
902 WARNING = BT_EVENT_CLASS_LOG_LEVEL_WARNING,
903 NOTICE = BT_EVENT_CLASS_LOG_LEVEL_NOTICE,
904 INFO = BT_EVENT_CLASS_LOG_LEVEL_INFO,
905 DEBUG_SYSTEM = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_SYSTEM,
906 DEBUG_PROGRAM = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROGRAM,
907 DEBUG_PROC = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROCESS,
908 DEBUG_MODULE = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_MODULE,
909 DEBUG_UNIT = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_UNIT,
910 DEBUG_FUNCTION = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_FUNCTION,
911 DEBUG_LINE = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_LINE,
912 DEBUG = BT_EVENT_CLASS_LOG_LEVEL_DEBUG,
915 explicit CommonEventClass(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
919 template <typename OtherLibObjT>
920 CommonEventClass(const CommonEventClass<OtherLibObjT> eventClass) noexcept :
921 _ThisBorrowedObject {eventClass}
925 template <typename OtherLibObjT>
926 CommonEventClass operator=(const CommonEventClass<OtherLibObjT> eventClass) noexcept
928 _ThisBorrowedObject::operator=(eventClass);
932 CommonEventClass<const bt_event_class> asConst() const noexcept
934 return CommonEventClass<const bt_event_class> {*this};
937 _StreamClass streamClass() const noexcept;
939 std::uint64_t id() const noexcept
941 return bt_event_class_get_id(this->libObjPtr());
944 void name(const char * const name) const
946 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
948 const auto status = bt_event_class_set_name(this->libObjPtr(), name);
950 if (status == BT_EVENT_CLASS_SET_NAME_STATUS_MEMORY_ERROR) {
951 throw MemoryError {};
955 void name(const std::string& name) const
957 this->name(name.data());
960 const char *name() const noexcept
962 return bt_event_class_get_name(this->libObjPtr());
965 void logLevel(const LogLevel logLevel) const noexcept
967 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
969 bt_event_class_set_log_level(this->libObjPtr(),
970 static_cast<bt_event_class_log_level>(logLevel));
973 bt2s::optional<LogLevel> logLevel() const noexcept
975 bt_event_class_log_level libLogLevel;
977 if (bt_event_class_get_log_level(this->libObjPtr(), &libLogLevel)) {
978 return static_cast<LogLevel>(libLogLevel);
981 return bt2s::nullopt;
984 void emfUri(const char * const emfUri) const
986 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
988 const auto status = bt_event_class_set_emf_uri(this->libObjPtr(), emfUri);
990 if (status == BT_EVENT_CLASS_SET_EMF_URI_STATUS_MEMORY_ERROR) {
991 throw MemoryError {};
995 void emfUri(const std::string& emfUri) const
997 this->emfUri(emfUri.data());
1000 const char *emfUri() const noexcept
1002 return bt_event_class_get_emf_uri(this->libObjPtr());
1005 void payloadFieldClass(const StructureFieldClass fc) const
1007 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1010 bt_event_class_set_payload_field_class(this->libObjPtr(), fc.libObjPtr());
1012 if (status == BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1013 throw MemoryError {};
1017 OptionalBorrowedObject<_StructureFieldClass> payloadFieldClass() const noexcept
1019 return _Spec::payloadFieldClass(this->libObjPtr());
1022 void specificContextFieldClass(const StructureFieldClass fc) const
1024 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1027 bt_event_class_set_specific_context_field_class(this->libObjPtr(), fc.libObjPtr());
1029 if (status == BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1030 throw MemoryError {};
1034 OptionalBorrowedObject<_StructureFieldClass> specificContextFieldClass() const noexcept
1036 return _Spec::specificContextFieldClass(this->libObjPtr());
1039 template <typename LibValT>
1040 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
1042 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1044 bt_event_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
1047 UserAttributes userAttributes() const noexcept
1049 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
1052 Shared shared() const noexcept
1054 return Shared::createWithRef(*this);
1058 using EventClass = CommonEventClass<bt_event_class>;
1059 using ConstEventClass = CommonEventClass<const bt_event_class>;
1061 namespace internal {
1063 struct EventClassTypeDescr
1065 using Const = ConstEventClass;
1066 using NonConst = EventClass;
1070 struct TypeDescr<EventClass> : public EventClassTypeDescr
1075 struct TypeDescr<ConstEventClass> : public EventClassTypeDescr
1079 } /* namespace internal */
1081 template <typename LibObjT>
1082 typename CommonEvent<LibObjT>::Class CommonEvent<LibObjT>::cls() const noexcept
1084 return Class {_Spec::cls(this->libObjPtr())};
1087 namespace internal {
1089 struct StreamClassRefFuncs final
1091 static void get(const bt_stream_class * const libObjPtr) noexcept
1093 bt_stream_class_get_ref(libObjPtr);
1096 static void put(const bt_stream_class * const libObjPtr) noexcept
1098 bt_stream_class_put_ref(libObjPtr);
1102 template <typename LibObjT>
1103 struct CommonStreamClassSpec;
1105 /* Functions specific to mutable stream classes */
1107 struct CommonStreamClassSpec<bt_stream_class> final
1109 static bt_trace_class *traceClass(bt_stream_class * const libObjPtr) noexcept
1111 return bt_stream_class_borrow_trace_class(libObjPtr);
1114 static bt_event_class *eventClassByIndex(bt_stream_class * const libObjPtr,
1115 const std::uint64_t index) noexcept
1117 return bt_stream_class_borrow_event_class_by_index(libObjPtr, index);
1120 static bt_event_class *eventClassById(bt_stream_class * const libObjPtr,
1121 const std::uint64_t id) noexcept
1123 return bt_stream_class_borrow_event_class_by_id(libObjPtr, id);
1126 static bt_clock_class *defaultClockClass(bt_stream_class * const libObjPtr) noexcept
1128 return bt_stream_class_borrow_default_clock_class(libObjPtr);
1131 static bt_field_class *packetContextFieldClass(bt_stream_class * const libObjPtr) noexcept
1133 return bt_stream_class_borrow_packet_context_field_class(libObjPtr);
1136 static bt_field_class *eventCommonContextFieldClass(bt_stream_class * const libObjPtr) noexcept
1138 return bt_stream_class_borrow_event_common_context_field_class(libObjPtr);
1141 static bt_value *userAttributes(bt_stream_class * const libObjPtr) noexcept
1143 return bt_stream_class_borrow_user_attributes(libObjPtr);
1147 /* Functions specific to constant stream classes */
1149 struct CommonStreamClassSpec<const bt_stream_class> final
1151 static const bt_trace_class *traceClass(const bt_stream_class * const libObjPtr) noexcept
1153 return bt_stream_class_borrow_trace_class_const(libObjPtr);
1156 static const bt_event_class *eventClassByIndex(const bt_stream_class * const libObjPtr,
1157 const std::uint64_t index) noexcept
1159 return bt_stream_class_borrow_event_class_by_index_const(libObjPtr, index);
1162 static const bt_event_class *eventClassById(const bt_stream_class * const libObjPtr,
1163 const std::uint64_t id) noexcept
1165 return bt_stream_class_borrow_event_class_by_id_const(libObjPtr, id);
1168 static const bt_clock_class *defaultClockClass(const bt_stream_class * const libObjPtr) noexcept
1170 return bt_stream_class_borrow_default_clock_class_const(libObjPtr);
1173 static const bt_field_class *
1174 packetContextFieldClass(const bt_stream_class * const libObjPtr) noexcept
1176 return bt_stream_class_borrow_packet_context_field_class_const(libObjPtr);
1179 static const bt_field_class *
1180 eventCommonContextFieldClass(const bt_stream_class * const libObjPtr) noexcept
1182 return bt_stream_class_borrow_event_common_context_field_class_const(libObjPtr);
1185 static const bt_value *userAttributes(const bt_stream_class * const libObjPtr) noexcept
1187 return bt_stream_class_borrow_user_attributes_const(libObjPtr);
1191 } /* namespace internal */
1193 template <typename LibObjT>
1194 class CommonStreamClass final : public BorrowedObject<LibObjT>
1197 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
1198 using _Spec = internal::CommonStreamClassSpec<LibObjT>;
1199 using _StructureFieldClass = internal::DepStructFc<LibObjT>;
1201 using _TraceClass = internal::DepType<LibObjT, CommonTraceClass<bt_trace_class>,
1202 CommonTraceClass<const bt_trace_class>>;
1204 using _EventClass = internal::DepType<LibObjT, CommonEventClass<bt_event_class>,
1205 CommonEventClass<const bt_event_class>>;
1207 using _ClockClass = internal::DepType<LibObjT, ClockClass, ConstClockClass>;
1210 using typename BorrowedObject<LibObjT>::LibObjPtr;
1211 using Shared = SharedObject<CommonStreamClass, LibObjT, internal::StreamClassRefFuncs>;
1212 using UserAttributes = internal::DepUserAttrs<LibObjT>;
1214 explicit CommonStreamClass(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
1218 template <typename OtherLibObjT>
1219 CommonStreamClass(const CommonStreamClass<OtherLibObjT> streamClass) noexcept :
1220 _ThisBorrowedObject {streamClass}
1224 template <typename OtherLibObjT>
1225 CommonStreamClass operator=(const CommonStreamClass<OtherLibObjT> streamClass) noexcept
1227 _ThisBorrowedObject::operator=(streamClass);
1231 CommonStreamClass<const bt_stream_class> asConst() const noexcept
1233 return CommonStreamClass<const bt_stream_class> {*this};
1236 Stream::Shared instantiate(const Trace trace) const
1238 static_assert(!std::is_const<LibObjT>::value,
1239 "Not available with `bt2::ConstStreamClass`.");
1241 const auto libObjPtr = bt_stream_create(this->libObjPtr(), trace.libObjPtr());
1243 internal::validateCreatedObjPtr(libObjPtr);
1244 return Stream::Shared::createWithoutRef(libObjPtr);
1247 Stream::Shared instantiate(const Trace trace, const std::uint64_t id) const
1249 static_assert(!std::is_const<LibObjT>::value,
1250 "Not available with `bt2::ConstStreamClass`.");
1252 const auto libObjPtr = bt_stream_create_with_id(this->libObjPtr(), trace.libObjPtr(), id);
1254 internal::validateCreatedObjPtr(libObjPtr);
1255 return Stream::Shared::createWithoutRef(libObjPtr);
1258 EventClass::Shared createEventClass() const
1260 static_assert(!std::is_const<LibObjT>::value,
1261 "Not available with `bt2::ConstStreamClass`.");
1263 const auto libObjPtr = bt_event_class_create(this->libObjPtr());
1265 internal::validateCreatedObjPtr(libObjPtr);
1266 return EventClass::Shared::createWithoutRef(libObjPtr);
1269 EventClass::Shared createEventClass(const std::uint64_t id) const
1271 static_assert(!std::is_const<LibObjT>::value,
1272 "Not available with `bt2::ConstStreamClass`.");
1274 const auto libObjPtr = bt_event_class_create_with_id(this->libObjPtr(), id);
1276 internal::validateCreatedObjPtr(libObjPtr);
1277 return EventClass::Shared::createWithoutRef(libObjPtr);
1280 _TraceClass traceClass() const noexcept;
1282 std::uint64_t id() const noexcept
1284 return bt_stream_class_get_id(this->libObjPtr());
1287 void name(const char * const name) const
1289 static_assert(!std::is_const<LibObjT>::value,
1290 "Not available with `bt2::ConstStreamClass`.");
1292 const auto status = bt_stream_class_set_name(this->libObjPtr(), name);
1294 if (status == BT_STREAM_CLASS_SET_NAME_STATUS_MEMORY_ERROR) {
1295 throw MemoryError {};
1299 void name(const std::string& name) const
1301 this->name(name.data());
1304 const char *name() const noexcept
1306 return bt_stream_class_get_name(this->libObjPtr());
1309 void assignsAutomaticEventClassId(const bool val) const noexcept
1311 static_assert(!std::is_const<LibObjT>::value,
1312 "Not available with `bt2::ConstStreamClass`.");
1314 bt_stream_class_set_assigns_automatic_event_class_id(this->libObjPtr(),
1315 static_cast<bt_bool>(val));
1318 bool assignsAutomaticEventClassId() const noexcept
1320 return static_cast<bool>(
1321 bt_stream_class_assigns_automatic_event_class_id(this->libObjPtr()));
1324 void assignsAutomaticStreamId(const bool val) const noexcept
1326 static_assert(!std::is_const<LibObjT>::value,
1327 "Not available with `bt2::ConstStreamClass`.");
1329 bt_stream_class_set_assigns_automatic_stream_id(this->libObjPtr(),
1330 static_cast<bt_bool>(val));
1333 bool assignsAutomaticStreamId() const noexcept
1335 return static_cast<bool>(bt_stream_class_assigns_automatic_stream_id(this->libObjPtr()));
1338 void supportsPackets(const bool supportsPackets, const bool withBeginningDefaultClkSnapshot,
1339 const bool withEndDefaultClkSnapshot) const noexcept
1341 static_assert(!std::is_const<LibObjT>::value,
1342 "Not available with `bt2::ConstStreamClass`.");
1344 bt_stream_class_set_supports_packets(this->libObjPtr(),
1345 static_cast<bt_bool>(supportsPackets),
1346 static_cast<bt_bool>(withBeginningDefaultClkSnapshot),
1347 static_cast<bt_bool>(withEndDefaultClkSnapshot));
1350 bool supportsPackets() const noexcept
1352 return static_cast<bool>(bt_stream_class_supports_packets(this->libObjPtr()));
1355 bool packetsHaveBeginningClockSnapshot() const noexcept
1357 return static_cast<bool>(
1358 bt_stream_class_packets_have_beginning_default_clock_snapshot(this->libObjPtr()));
1361 bool packetsHaveEndClockSnapshot() const noexcept
1363 return static_cast<bool>(
1364 bt_stream_class_packets_have_end_default_clock_snapshot(this->libObjPtr()));
1367 void supportsDiscardedEvents(const bool supportsDiscardedEvents,
1368 const bool withDefaultClkSnapshots) const noexcept
1370 static_assert(!std::is_const<LibObjT>::value,
1371 "Not available with `bt2::ConstStreamClass`.");
1373 bt_stream_class_set_supports_discarded_events(
1374 this->libObjPtr(), static_cast<bt_bool>(supportsDiscardedEvents),
1375 static_cast<bt_bool>(withDefaultClkSnapshots));
1378 bool supportsDiscardedEvents() const noexcept
1380 return static_cast<bool>(bt_stream_class_supports_discarded_events(this->libObjPtr()));
1383 bool discardedEventsHaveDefaultClockSnapshots() const noexcept
1385 return static_cast<bool>(
1386 bt_stream_class_discarded_events_have_default_clock_snapshots(this->libObjPtr()));
1389 void supportsDiscardedPackets(const bool supportsDiscardedPackets,
1390 const bool withDefaultClkSnapshots) const noexcept
1392 static_assert(!std::is_const<LibObjT>::value,
1393 "Not available with `bt2::ConstStreamClass`.");
1395 bt_stream_class_set_supports_discarded_packets(
1396 this->libObjPtr(), static_cast<bt_bool>(supportsDiscardedPackets),
1397 static_cast<bt_bool>(withDefaultClkSnapshots));
1400 bool supportsDiscardedPackets() const noexcept
1402 return static_cast<bool>(bt_stream_class_supports_discarded_packets(this->libObjPtr()));
1405 bool discardedPacketsHaveDefaultClockSnapshots() const noexcept
1407 return static_cast<bool>(
1408 bt_stream_class_discarded_packets_have_default_clock_snapshots(this->libObjPtr()));
1411 void defaultClockClass(const ClockClass clkCls) const
1413 static_assert(!std::is_const<LibObjT>::value,
1414 "Not available with `bt2::ConstStreamClass`.");
1417 bt_stream_class_set_default_clock_class(this->libObjPtr(), clkCls.libObjPtr());
1419 BT_ASSERT(status == BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK);
1422 OptionalBorrowedObject<_ClockClass> defaultClockClass() const noexcept
1424 return _Spec::defaultClockClass(this->libObjPtr());
1427 std::uint64_t length() const noexcept
1429 return bt_stream_class_get_event_class_count(this->libObjPtr());
1432 _EventClass operator[](const std::uint64_t index) const noexcept
1434 return _EventClass {_Spec::eventClassByIndex(this->libObjPtr(), index)};
1437 OptionalBorrowedObject<_EventClass> eventClassById(const std::uint64_t id) const noexcept
1439 return _Spec::eventClassById(this->libObjPtr(), id);
1442 void packetContextFieldClass(const StructureFieldClass fc) const
1444 static_assert(!std::is_const<LibObjT>::value,
1445 "Not available with `bt2::ConstStreamClass`.");
1448 bt_stream_class_set_packet_context_field_class(this->libObjPtr(), fc.libObjPtr());
1450 if (status == BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1451 throw MemoryError {};
1455 OptionalBorrowedObject<_StructureFieldClass> packetContextFieldClass() const noexcept
1457 return _Spec::packetContextFieldClass(this->libObjPtr());
1460 void eventCommonContextFieldClass(const StructureFieldClass fc) const
1462 static_assert(!std::is_const<LibObjT>::value,
1463 "Not available with `bt2::ConstStreamClass`.");
1466 bt_stream_class_set_event_common_context_field_class(this->libObjPtr(), fc.libObjPtr());
1468 if (status == BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1469 throw MemoryError {};
1473 OptionalBorrowedObject<_StructureFieldClass> eventCommonContextFieldClass() const noexcept
1475 return _Spec::eventCommonContextFieldClass(this->libObjPtr());
1478 template <typename LibValT>
1479 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
1481 static_assert(!std::is_const<LibObjT>::value,
1482 "Not available with `bt2::ConstStreamClass`.");
1484 bt_stream_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
1487 UserAttributes userAttributes() const noexcept
1489 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
1492 Shared shared() const noexcept
1494 return Shared::createWithRef(*this);
1498 using StreamClass = CommonStreamClass<bt_stream_class>;
1499 using ConstStreamClass = CommonStreamClass<const bt_stream_class>;
1501 namespace internal {
1503 struct StreamClassTypeDescr
1505 using Const = ConstStreamClass;
1506 using NonConst = StreamClass;
1510 struct TypeDescr<StreamClass> : public StreamClassTypeDescr
1515 struct TypeDescr<ConstStreamClass> : public StreamClassTypeDescr
1519 } /* namespace internal */
1521 template <typename LibObjT>
1522 typename CommonEventClass<LibObjT>::_StreamClass
1523 CommonEventClass<LibObjT>::streamClass() const noexcept
1525 return _StreamClass {_Spec::streamClass(this->libObjPtr())};
1528 template <typename LibObjT>
1529 typename CommonStream<LibObjT>::Class CommonStream<LibObjT>::cls() const noexcept
1531 return Class {_Spec::cls(this->libObjPtr())};
1534 namespace internal {
1536 struct TraceClassRefFuncs final
1538 static void get(const bt_trace_class * const libObjPtr) noexcept
1540 bt_trace_class_get_ref(libObjPtr);
1543 static void put(const bt_trace_class * const libObjPtr) noexcept
1545 bt_trace_class_put_ref(libObjPtr);
1549 template <typename LibObjT>
1550 struct CommonTraceClassSpec;
1552 /* Functions specific to mutable stream classes */
1554 struct CommonTraceClassSpec<bt_trace_class> final
1556 static bt_stream_class *streamClassByIndex(bt_trace_class * const libObjPtr,
1557 const std::uint64_t index) noexcept
1559 return bt_trace_class_borrow_stream_class_by_index(libObjPtr, index);
1562 static bt_stream_class *streamClassById(bt_trace_class * const libObjPtr,
1563 const std::uint64_t id) noexcept
1565 return bt_trace_class_borrow_stream_class_by_id(libObjPtr, id);
1568 static bt_value *userAttributes(bt_trace_class * const libObjPtr) noexcept
1570 return bt_trace_class_borrow_user_attributes(libObjPtr);
1574 /* Functions specific to constant stream classes */
1576 struct CommonTraceClassSpec<const bt_trace_class> final
1578 static const bt_stream_class *streamClassByIndex(const bt_trace_class * const libObjPtr,
1579 const std::uint64_t index) noexcept
1581 return bt_trace_class_borrow_stream_class_by_index_const(libObjPtr, index);
1584 static const bt_stream_class *streamClassById(const bt_trace_class * const libObjPtr,
1585 const std::uint64_t id) noexcept
1587 return bt_trace_class_borrow_stream_class_by_id_const(libObjPtr, id);
1590 static const bt_value *userAttributes(const bt_trace_class * const libObjPtr) noexcept
1592 return bt_trace_class_borrow_user_attributes_const(libObjPtr);
1596 } /* namespace internal */
1598 template <typename LibObjT>
1599 class CommonTraceClass final : public BorrowedObject<LibObjT>
1602 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
1604 using _Spec = internal::CommonTraceClassSpec<LibObjT>;
1606 using _StreamClass = internal::DepType<LibObjT, CommonStreamClass<bt_stream_class>,
1607 CommonStreamClass<const bt_stream_class>>;
1610 using typename BorrowedObject<LibObjT>::LibObjPtr;
1611 using Shared = SharedObject<CommonTraceClass, LibObjT, internal::TraceClassRefFuncs>;
1612 using UserAttributes = internal::DepUserAttrs<LibObjT>;
1614 explicit CommonTraceClass(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
1618 template <typename OtherLibObjT>
1619 CommonTraceClass(const CommonTraceClass<OtherLibObjT> traceClass) noexcept :
1620 _ThisBorrowedObject {traceClass}
1624 template <typename OtherLibObjT>
1625 CommonTraceClass operator=(const CommonTraceClass<OtherLibObjT> traceClass) noexcept
1627 _ThisBorrowedObject::operator=(traceClass);
1631 CommonTraceClass<const bt_trace_class> asConst() const noexcept
1633 return CommonTraceClass<const bt_trace_class> {*this};
1636 Trace::Shared instantiate() const
1638 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1640 const auto libObjPtr = bt_trace_create(this->libObjPtr());
1642 internal::validateCreatedObjPtr(libObjPtr);
1643 return Trace::Shared::createWithoutRef(libObjPtr);
1646 StreamClass::Shared createStreamClass() const
1648 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1650 const auto libObjPtr = bt_stream_class_create(this->libObjPtr());
1652 internal::validateCreatedObjPtr(libObjPtr);
1653 return StreamClass::Shared::createWithoutRef(libObjPtr);
1656 StreamClass::Shared createStreamClass(const std::uint64_t id) const
1658 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1660 const auto libObjPtr = bt_stream_class_create_with_id(this->libObjPtr(), id);
1662 internal::validateCreatedObjPtr(libObjPtr);
1663 return StreamClass::Shared::createWithoutRef(libObjPtr);
1666 FieldClass::Shared createBoolFieldClass() const
1668 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1670 const auto libObjPtr = bt_field_class_bool_create(this->libObjPtr());
1672 internal::validateCreatedObjPtr(libObjPtr);
1673 return FieldClass::Shared::createWithoutRef(libObjPtr);
1676 BitArrayFieldClass::Shared createBitArrayFieldClass(const std::uint64_t length) const
1678 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1680 const auto libObjPtr = bt_field_class_bit_array_create(this->libObjPtr(), length);
1682 internal::validateCreatedObjPtr(libObjPtr);
1683 return BitArrayFieldClass::Shared::createWithoutRef(libObjPtr);
1686 IntegerFieldClass::Shared createUnsignedIntegerFieldClass() const
1688 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1690 const auto libObjPtr = bt_field_class_integer_unsigned_create(this->libObjPtr());
1692 internal::validateCreatedObjPtr(libObjPtr);
1693 return IntegerFieldClass::Shared::createWithoutRef(libObjPtr);
1696 IntegerFieldClass::Shared createSignedIntegerFieldClass() const
1698 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1700 const auto libObjPtr = bt_field_class_integer_signed_create(this->libObjPtr());
1702 internal::validateCreatedObjPtr(libObjPtr);
1703 return IntegerFieldClass::Shared::createWithoutRef(libObjPtr);
1706 UnsignedEnumerationFieldClass::Shared createUnsignedEnumerationFieldClass() const
1708 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1710 const auto libObjPtr = bt_field_class_enumeration_unsigned_create(this->libObjPtr());
1712 internal::validateCreatedObjPtr(libObjPtr);
1713 return UnsignedEnumerationFieldClass::Shared::createWithoutRef(libObjPtr);
1716 SignedEnumerationFieldClass::Shared createSignedEnumerationFieldClass() const
1718 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1720 const auto libObjPtr = bt_field_class_enumeration_signed_create(this->libObjPtr());
1722 internal::validateCreatedObjPtr(libObjPtr);
1723 return SignedEnumerationFieldClass::Shared::createWithoutRef(libObjPtr);
1726 FieldClass::Shared createSinglePrecisionRealFieldClass() const
1728 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1730 const auto libObjPtr = bt_field_class_real_single_precision_create(this->libObjPtr());
1732 internal::validateCreatedObjPtr(libObjPtr);
1733 return FieldClass::Shared::createWithoutRef(libObjPtr);
1736 FieldClass::Shared createDoublePrecisionRealFieldClass() const
1738 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1740 const auto libObjPtr = bt_field_class_real_double_precision_create(this->libObjPtr());
1742 internal::validateCreatedObjPtr(libObjPtr);
1743 return FieldClass::Shared::createWithoutRef(libObjPtr);
1746 FieldClass::Shared createStringFieldClass() const
1748 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1750 const auto libObjPtr = bt_field_class_string_create(this->libObjPtr());
1752 internal::validateCreatedObjPtr(libObjPtr);
1753 return FieldClass::Shared::createWithoutRef(libObjPtr);
1756 StaticArrayFieldClass::Shared createStaticArrayFieldClass(const FieldClass elementFieldClass,
1757 const std::uint64_t length) const
1759 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1761 const auto libObjPtr = bt_field_class_array_static_create(
1762 this->libObjPtr(), elementFieldClass.libObjPtr(), length);
1764 internal::validateCreatedObjPtr(libObjPtr);
1765 return StaticArrayFieldClass::Shared::createWithoutRef(libObjPtr);
1768 ArrayFieldClass::Shared createDynamicArrayFieldClass(const FieldClass elementFieldClass) const
1770 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1772 const auto libObjPtr = bt_field_class_array_dynamic_create(
1773 this->libObjPtr(), elementFieldClass.libObjPtr(), nullptr);
1775 internal::validateCreatedObjPtr(libObjPtr);
1776 return ArrayFieldClass::Shared::createWithoutRef(libObjPtr);
1779 DynamicArrayWithLengthFieldClass::Shared
1780 createDynamicArrayFieldClass(const FieldClass elementFieldClass,
1781 const IntegerFieldClass lengthFieldClass) const
1783 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1785 const auto libObjPtr = bt_field_class_array_dynamic_create(
1786 this->libObjPtr(), elementFieldClass.libObjPtr(), lengthFieldClass.libObjPtr());
1788 internal::validateCreatedObjPtr(libObjPtr);
1789 return DynamicArrayWithLengthFieldClass::Shared::createWithoutRef(libObjPtr);
1792 StructureFieldClass::Shared createStructureFieldClass() const
1794 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1796 const auto libObjPtr = bt_field_class_structure_create(this->libObjPtr());
1798 internal::validateCreatedObjPtr(libObjPtr);
1799 return StructureFieldClass::Shared::createWithoutRef(libObjPtr);
1802 OptionFieldClass::Shared createOptionFieldClass(const FieldClass optionalFieldClass) const
1804 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1806 const auto libObjPtr = bt_field_class_option_without_selector_create(
1807 this->libObjPtr(), optionalFieldClass.libObjPtr());
1809 internal::validateCreatedObjPtr(libObjPtr);
1810 return OptionFieldClass::Shared::createWithoutRef(libObjPtr);
1813 OptionWithBoolSelectorFieldClass::Shared
1814 createOptionWithBoolSelectorFieldClass(const FieldClass optionalFieldClass,
1815 const FieldClass selectorFieldClass) const
1817 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1819 const auto libObjPtr = bt_field_class_option_with_selector_field_bool_create(
1820 this->libObjPtr(), optionalFieldClass.libObjPtr(), selectorFieldClass.libObjPtr());
1822 internal::validateCreatedObjPtr(libObjPtr);
1823 return OptionWithBoolSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
1826 OptionWithUnsignedIntegerSelectorFieldClass::Shared
1827 createOptionWithUnsignedIntegerSelectorFieldClass(
1828 const FieldClass optionalFieldClass, const IntegerFieldClass selectorFieldClass,
1829 const ConstUnsignedIntegerRangeSet ranges) const
1831 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1833 const auto libObjPtr = bt_field_class_option_with_selector_field_integer_unsigned_create(
1834 this->libObjPtr(), optionalFieldClass.libObjPtr(), selectorFieldClass.libObjPtr(),
1835 ranges.libObjPtr());
1837 internal::validateCreatedObjPtr(libObjPtr);
1838 return OptionWithUnsignedIntegerSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
1841 OptionWithSignedIntegerSelectorFieldClass::Shared
1842 createOptionWithSignedIntegerSelectorFieldClass(const FieldClass optionalFieldClass,
1843 const IntegerFieldClass selectorFieldClass,
1844 const ConstSignedIntegerRangeSet ranges) const
1846 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1848 const auto libObjPtr = bt_field_class_option_with_selector_field_integer_signed_create(
1849 this->libObjPtr(), optionalFieldClass.libObjPtr(), selectorFieldClass.libObjPtr(),
1850 ranges.libObjPtr());
1852 internal::validateCreatedObjPtr(libObjPtr);
1853 return OptionWithSignedIntegerSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
1856 VariantWithoutSelectorFieldClass::Shared createVariantFieldClass() const
1858 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1860 const auto libObjPtr = bt_field_class_variant_create(this->libObjPtr(), nullptr);
1862 internal::validateCreatedObjPtr(libObjPtr);
1863 return VariantWithoutSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
1866 VariantWithUnsignedIntegerSelectorFieldClass::Shared
1867 createVariantWithUnsignedIntegerSelectorFieldClass(
1868 const IntegerFieldClass selectorFieldClass) const
1870 return this->_createVariantWithIntegerSelectorFieldClass<
1871 VariantWithUnsignedIntegerSelectorFieldClass>(selectorFieldClass);
1874 VariantWithSignedIntegerSelectorFieldClass::Shared
1875 createVariantWithSignedIntegerSelectorFieldClass(
1876 const IntegerFieldClass selectorFieldClass) const
1878 return this->_createVariantWithIntegerSelectorFieldClass<
1879 VariantWithSignedIntegerSelectorFieldClass>(selectorFieldClass);
1882 void assignsAutomaticStreamClassId(const bool val) const noexcept
1884 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1886 bt_trace_class_set_assigns_automatic_stream_class_id(this->libObjPtr(),
1887 static_cast<bt_bool>(val));
1890 bool assignsAutomaticStreamClassId() const noexcept
1892 return static_cast<bool>(
1893 bt_trace_class_assigns_automatic_stream_class_id(this->libObjPtr()));
1896 std::uint64_t length() const noexcept
1898 return bt_trace_class_get_stream_class_count(this->libObjPtr());
1901 _StreamClass operator[](const std::uint64_t index) const noexcept
1903 return _StreamClass {_Spec::streamClassByIndex(this->libObjPtr(), index)};
1906 OptionalBorrowedObject<_StreamClass> streamClassById(const std::uint64_t id) const noexcept
1908 return _Spec::streamClassById(this->libObjPtr(), id);
1911 template <typename LibValT>
1912 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
1914 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1916 bt_trace_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
1919 UserAttributes userAttributes() const noexcept
1921 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
1924 Shared shared() const noexcept
1926 return Shared::createWithRef(*this);
1930 template <typename ObjT>
1931 typename ObjT::Shared
1932 _createVariantWithIntegerSelectorFieldClass(const IntegerFieldClass selectorFieldClass) const
1934 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1936 const auto libObjPtr =
1937 bt_field_class_variant_create(this->libObjPtr(), selectorFieldClass.libObjPtr());
1939 internal::validateCreatedObjPtr(libObjPtr);
1940 return ObjT::Shared::createWithoutRef(libObjPtr);
1944 using TraceClass = CommonTraceClass<bt_trace_class>;
1945 using ConstTraceClass = CommonTraceClass<const bt_trace_class>;
1947 namespace internal {
1949 struct TraceClassTypeDescr
1951 using Const = ConstTraceClass;
1952 using NonConst = TraceClass;
1956 struct TypeDescr<TraceClass> : public TraceClassTypeDescr
1961 struct TypeDescr<ConstTraceClass> : public TraceClassTypeDescr
1965 } /* namespace internal */
1967 template <typename LibObjT>
1968 typename CommonStreamClass<LibObjT>::_TraceClass
1969 CommonStreamClass<LibObjT>::traceClass() const noexcept
1971 return _TraceClass {_Spec::traceClass(this->libObjPtr())};
1974 template <typename LibObjT>
1975 typename CommonTrace<LibObjT>::Class CommonTrace<LibObjT>::cls() const noexcept
1977 return Class {_Spec::cls(this->libObjPtr())};
1980 } /* namespace bt2 */
1982 #endif /* BABELTRACE_CPP_COMMON_BT2_TRACE_IR_HPP */