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/optional.hpp"
16 #include "cpp-common/string_view.hpp"
18 #include "borrowed-object.hpp"
19 #include "clock-class.hpp"
20 #include "field-class.hpp"
22 #include "internal/utils.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 } /* namespace internal */
126 template <typename LibObjT>
127 class CommonEvent final : public BorrowedObject<LibObjT>
130 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
131 using typename BorrowedObject<LibObjT>::_LibObjPtr;
132 using _Spec = internal::CommonEventSpec<LibObjT>;
135 typename std::conditional<std::is_const<LibObjT>::value, CommonPacket<const bt_packet>,
136 CommonPacket<bt_packet>>::type;
139 typename std::conditional<std::is_const<LibObjT>::value, CommonStream<const bt_stream>,
140 CommonStream<bt_stream>>::type;
142 using _StructureField = typename std::conditional<std::is_const<LibObjT>::value,
143 ConstStructureField, StructureField>::type;
146 using Class = typename std::conditional<std::is_const<LibObjT>::value,
147 CommonEventClass<const bt_event_class>,
148 CommonEventClass<bt_event_class>>::type;
150 explicit CommonEvent(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
154 template <typename OtherLibObjT>
155 CommonEvent(const CommonEvent<OtherLibObjT> event) noexcept : _ThisBorrowedObject {event}
159 template <typename OtherLibObjT>
160 CommonEvent<LibObjT>& operator=(const CommonEvent<OtherLibObjT> event) noexcept
162 _ThisBorrowedObject::operator=(event);
166 CommonEvent<const bt_event> asConst() const noexcept
168 return CommonEvent<const bt_event> {*this};
171 Class cls() const noexcept;
172 _Stream stream() const noexcept;
173 nonstd::optional<_Packet> packet() const noexcept;
175 nonstd::optional<_StructureField> payloadField() const noexcept
177 const auto libObjPtr = _Spec::payloadField(this->libObjPtr());
180 return _StructureField {libObjPtr};
183 return nonstd::nullopt;
186 nonstd::optional<_StructureField> specificContextField() const noexcept
188 const auto libObjPtr = _Spec::specificContextField(this->libObjPtr());
191 return _StructureField {libObjPtr};
194 return nonstd::nullopt;
197 nonstd::optional<_StructureField> commonContextField() const noexcept
199 const auto libObjPtr = _Spec::commonContextField(this->libObjPtr());
202 return _StructureField {libObjPtr};
205 return nonstd::nullopt;
209 using Event = CommonEvent<bt_event>;
210 using ConstEvent = CommonEvent<const bt_event>;
214 struct EventTypeDescr
216 using Const = ConstEvent;
217 using NonConst = Event;
221 struct TypeDescr<Event> : public EventTypeDescr
226 struct TypeDescr<ConstEvent> : public EventTypeDescr
230 struct PacketRefFuncs final
232 static void get(const bt_packet * const libObjPtr) noexcept
234 bt_packet_get_ref(libObjPtr);
237 static void put(const bt_packet * const libObjPtr) noexcept
239 bt_packet_put_ref(libObjPtr);
243 template <typename LibObjT>
244 struct CommonPacketSpec;
246 /* Functions specific to mutable packets */
248 struct CommonPacketSpec<bt_packet> final
250 static bt_stream *stream(bt_packet * const libObjPtr) noexcept
252 return bt_packet_borrow_stream(libObjPtr);
255 static bt_field *contextField(bt_packet * const libObjPtr) noexcept
257 return bt_packet_borrow_context_field(libObjPtr);
261 /* Functions specific to constant packets */
263 struct CommonPacketSpec<const bt_packet> final
265 static const bt_stream *stream(const bt_packet * const libObjPtr) noexcept
267 return bt_packet_borrow_stream_const(libObjPtr);
270 static const bt_field *contextField(const bt_packet * const libObjPtr) noexcept
272 return bt_packet_borrow_context_field_const(libObjPtr);
276 } /* namespace internal */
278 template <typename LibObjT>
279 class CommonPacket final : public BorrowedObject<LibObjT>
282 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
283 using typename BorrowedObject<LibObjT>::_LibObjPtr;
284 using _Spec = internal::CommonPacketSpec<LibObjT>;
285 using _ThisCommonPacket = CommonPacket<LibObjT>;
288 typename std::conditional<std::is_const<LibObjT>::value, CommonStream<const bt_stream>,
289 CommonStream<bt_stream>>::type;
291 using _StructureField = typename std::conditional<std::is_const<LibObjT>::value,
292 ConstStructureField, StructureField>::type;
295 using Shared = SharedObject<_ThisCommonPacket, LibObjT, internal::PacketRefFuncs>;
297 explicit CommonPacket(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
301 template <typename OtherLibObjT>
302 CommonPacket(const CommonPacket<OtherLibObjT> packet) noexcept : _ThisBorrowedObject {packet}
306 template <typename OtherLibObjT>
307 _ThisCommonPacket& operator=(const CommonPacket<OtherLibObjT> packet) noexcept
309 _ThisBorrowedObject::operator=(packet);
313 CommonPacket<const bt_packet> asConst() const noexcept
315 return CommonPacket<const bt_packet> {*this};
318 _Stream stream() const noexcept;
320 nonstd::optional<_StructureField> contextField() const noexcept
322 const auto libObjPtr = _Spec::contextField(this->libObjPtr());
325 return _StructureField {libObjPtr};
328 return nonstd::nullopt;
331 Shared shared() const noexcept
333 return Shared::createWithRef(*this);
337 using Packet = CommonPacket<bt_packet>;
338 using ConstPacket = CommonPacket<const bt_packet>;
342 struct PacketTypeDescr
344 using Const = ConstPacket;
345 using NonConst = Packet;
349 struct TypeDescr<Packet> : public PacketTypeDescr
354 struct TypeDescr<ConstPacket> : public PacketTypeDescr
358 } /* namespace internal */
360 template <typename LibObjT>
361 nonstd::optional<typename CommonEvent<LibObjT>::_Packet>
362 CommonEvent<LibObjT>::packet() const noexcept
364 const auto libObjPtr = _Spec::packet(this->libObjPtr());
367 return _Packet {libObjPtr};
370 return nonstd::nullopt;
375 struct StreamRefFuncs final
377 static void get(const bt_stream * const libObjPtr) noexcept
379 bt_stream_get_ref(libObjPtr);
382 static void put(const bt_stream * const libObjPtr) noexcept
384 bt_stream_put_ref(libObjPtr);
388 template <typename LibObjT>
389 struct CommonStreamSpec;
391 /* Functions specific to mutable streams */
393 struct CommonStreamSpec<bt_stream> final
395 static bt_stream_class *cls(bt_stream * const libObjPtr) noexcept
397 return bt_stream_borrow_class(libObjPtr);
400 static bt_trace *trace(bt_stream * const libObjPtr) noexcept
402 return bt_stream_borrow_trace(libObjPtr);
405 static bt_value *userAttributes(bt_stream * const libObjPtr) noexcept
407 return bt_stream_borrow_user_attributes(libObjPtr);
411 /* Functions specific to constant streams */
413 struct CommonStreamSpec<const bt_stream> final
415 static const bt_stream_class *cls(const bt_stream * const libObjPtr) noexcept
417 return bt_stream_borrow_class_const(libObjPtr);
420 static const bt_trace *trace(const bt_stream * const libObjPtr) noexcept
422 return bt_stream_borrow_trace_const(libObjPtr);
425 static const bt_value *userAttributes(const bt_stream * const libObjPtr) noexcept
427 return bt_stream_borrow_user_attributes_const(libObjPtr);
431 } /* namespace internal */
433 template <typename LibObjT>
434 class CommonStream final : public BorrowedObject<LibObjT>
437 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
438 using typename BorrowedObject<LibObjT>::_LibObjPtr;
439 using _Spec = internal::CommonStreamSpec<LibObjT>;
440 using _ThisCommonStream = CommonStream<LibObjT>;
443 typename std::conditional<std::is_const<LibObjT>::value, CommonTrace<const bt_trace>,
444 CommonTrace<bt_trace>>::type;
447 using Shared = SharedObject<_ThisCommonStream, LibObjT, internal::StreamRefFuncs>;
449 using Class = typename std::conditional<std::is_const<LibObjT>::value,
450 CommonStreamClass<const bt_stream_class>,
451 CommonStreamClass<bt_stream_class>>::type;
453 using UserAttributes =
454 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
456 explicit CommonStream(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
460 template <typename OtherLibObjT>
461 CommonStream(const CommonStream<OtherLibObjT> stream) noexcept : _ThisBorrowedObject {stream}
465 template <typename OtherLibObjT>
466 _ThisCommonStream& operator=(const CommonStream<OtherLibObjT> stream) noexcept
468 _ThisBorrowedObject::operator=(stream);
472 CommonStream<const bt_stream> asConst() const noexcept
474 return CommonStream<const bt_stream> {*this};
477 Packet::Shared createPacket() const
479 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstStream`.");
481 const auto libObjPtr = bt_packet_create(this->libObjPtr());
483 internal::validateCreatedObjPtr(libObjPtr);
484 return Packet::Shared::createWithoutRef(libObjPtr);
487 Class cls() const noexcept;
488 _Trace trace() const noexcept;
490 std::uint64_t id() const noexcept
492 return bt_stream_get_id(this->libObjPtr());
495 void name(const char * const name) const
497 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstStream`.");
499 const auto status = bt_stream_set_name(this->libObjPtr(), name);
501 if (status == BT_STREAM_SET_NAME_STATUS_MEMORY_ERROR) {
502 throw MemoryError {};
506 void name(const std::string& name) const
508 this->name(name.data());
511 nonstd::optional<bpstd::string_view> name() const noexcept
513 const auto name = bt_stream_get_name(this->libObjPtr());
519 return nonstd::nullopt;
522 template <typename LibValT>
523 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
525 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstStream`.");
527 bt_stream_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
530 UserAttributes userAttributes() const noexcept
532 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
535 Shared shared() const noexcept
537 return Shared::createWithRef(*this);
541 using Stream = CommonStream<bt_stream>;
542 using ConstStream = CommonStream<const bt_stream>;
546 struct StreamTypeDescr
548 using Const = ConstStream;
549 using NonConst = Stream;
553 struct TypeDescr<Stream> : public StreamTypeDescr
558 struct TypeDescr<ConstStream> : public StreamTypeDescr
562 } /* namespace internal */
564 template <typename LibObjT>
565 typename CommonEvent<LibObjT>::_Stream CommonEvent<LibObjT>::stream() const noexcept
567 return _Stream {_Spec::stream(this->libObjPtr())};
570 template <typename LibObjT>
571 typename CommonPacket<LibObjT>::_Stream CommonPacket<LibObjT>::stream() const noexcept
573 return _Stream {_Spec::stream(this->libObjPtr())};
578 struct TraceRefFuncs final
580 static void get(const bt_trace * const libObjPtr) noexcept
582 bt_trace_get_ref(libObjPtr);
585 static void put(const bt_trace * const libObjPtr) noexcept
587 bt_trace_put_ref(libObjPtr);
591 template <typename LibObjT>
592 struct CommonTraceSpec;
594 /* Functions specific to mutable traces */
596 struct CommonTraceSpec<bt_trace> final
598 static bt_trace_class *cls(bt_trace * const libObjPtr) noexcept
600 return bt_trace_borrow_class(libObjPtr);
603 static bt_stream *streamByIndex(bt_trace * const libObjPtr, const std::uint64_t index) noexcept
605 return bt_trace_borrow_stream_by_index(libObjPtr, index);
608 static bt_stream *streamById(bt_trace * const libObjPtr, const std::uint64_t id) noexcept
610 return bt_trace_borrow_stream_by_id(libObjPtr, id);
613 static bt_value *userAttributes(bt_trace * const libObjPtr) noexcept
615 return bt_trace_borrow_user_attributes(libObjPtr);
619 /* Functions specific to constant traces */
621 struct CommonTraceSpec<const bt_trace> final
623 static const bt_trace_class *cls(const bt_trace * const libObjPtr) noexcept
625 return bt_trace_borrow_class_const(libObjPtr);
628 static const bt_stream *streamByIndex(const bt_trace * const libObjPtr,
629 const std::uint64_t index) noexcept
631 return bt_trace_borrow_stream_by_index_const(libObjPtr, index);
634 static const bt_stream *streamById(const bt_trace * const libObjPtr,
635 const std::uint64_t id) noexcept
637 return bt_trace_borrow_stream_by_id_const(libObjPtr, id);
640 static const bt_value *userAttributes(const bt_trace * const libObjPtr) noexcept
642 return bt_trace_borrow_user_attributes_const(libObjPtr);
646 } /* namespace internal */
648 template <typename LibObjT>
649 class CommonTrace final : public BorrowedObject<LibObjT>
652 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
653 using typename BorrowedObject<LibObjT>::_LibObjPtr;
654 using _Spec = internal::CommonTraceSpec<LibObjT>;
655 using _ThisCommonTrace = CommonTrace<LibObjT>;
658 typename std::conditional<std::is_const<LibObjT>::value, CommonStream<const bt_stream>,
659 CommonStream<bt_stream>>::type;
662 using Shared = SharedObject<_ThisCommonTrace, LibObjT, internal::TraceRefFuncs>;
664 using Class = typename std::conditional<std::is_const<LibObjT>::value,
665 CommonTraceClass<const bt_trace_class>,
666 CommonTraceClass<bt_trace_class>>::type;
668 using UserAttributes =
669 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
671 struct ConstEnvironmentEntry
673 bpstd::string_view name;
677 explicit CommonTrace(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
681 template <typename OtherLibObjT>
682 CommonTrace(const CommonTrace<OtherLibObjT> trace) noexcept : _ThisBorrowedObject {trace}
686 template <typename OtherLibObjT>
687 _ThisCommonTrace& operator=(const CommonTrace<OtherLibObjT> trace) noexcept
689 _ThisBorrowedObject::operator=(trace);
693 CommonTrace<const bt_trace> asConst() const noexcept
695 return CommonTrace<const bt_trace> {*this};
698 Class cls() const noexcept;
700 void name(const char * const name) const
702 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
704 const auto status = bt_trace_set_name(this->libObjPtr(), name);
706 if (status == BT_TRACE_SET_NAME_STATUS_MEMORY_ERROR) {
707 throw MemoryError {};
711 void name(const std::string& name) const
713 this->name(name.data());
716 nonstd::optional<bpstd::string_view> name() const noexcept
718 const auto name = bt_trace_get_name(this->libObjPtr());
724 return nonstd::nullopt;
727 void uuid(const bt2_common::UuidView& uuid) const noexcept
729 bt_trace_set_uuid(this->libObjPtr(), uuid.begin());
732 nonstd::optional<bt2_common::UuidView> uuid() const noexcept
734 const auto uuid = bt_trace_get_uuid(this->libObjPtr());
737 return bt2_common::UuidView {uuid};
740 return nonstd::nullopt;
743 std::uint64_t length() const noexcept
745 return bt_trace_get_stream_count(this->libObjPtr());
748 _Stream operator[](const std::uint64_t index) const noexcept
750 return _Stream {_Spec::streamByIndex(this->libObjPtr(), index)};
753 nonstd::optional<_Stream> streamById(const std::uint64_t id) const noexcept
755 const auto libObjPtr = _Spec::streamById(this->libObjPtr(), id);
758 return _Stream {libObjPtr};
761 return nonstd::nullopt;
764 void environmentEntry(const char * const name, const std::int64_t val) const
766 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
768 const auto status = bt_trace_set_environment_entry_integer(this->libObjPtr(), name, val);
770 if (status == BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR) {
771 throw MemoryError {};
775 void environmentEntry(const std::string& name, const std::int64_t val) const
777 this->environmentEntry(name.data(), val);
780 void environmentEntry(const char * const name, const char * const val) const
782 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
784 const auto status = bt_trace_set_environment_entry_string(this->libObjPtr(), name, val);
786 if (status == BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR) {
787 throw MemoryError {};
791 void environmentEntry(const std::string& name, const char * const val) const
793 this->environmentEntry(name.data(), val);
796 void environmentEntry(const char * const name, const std::string& val) const
798 this->environmentEntry(name, val.data());
801 void environmentEntry(const std::string& name, const std::string& val) const
803 this->environmentEntry(name.data(), val.data());
806 std::uint64_t environmentSize() const noexcept
808 return bt_trace_get_environment_entry_count(this->libObjPtr());
811 ConstEnvironmentEntry environmentEntry(const std::uint64_t index) const noexcept
814 const bt_value *libObjPtr;
816 bt_trace_borrow_environment_entry_by_index_const(this->libObjPtr(), index, &name,
818 return ConstEnvironmentEntry {name, ConstValue {libObjPtr}};
821 nonstd::optional<ConstValue> environmentEntry(const char * const name) const noexcept
823 const auto libObjPtr =
824 bt_trace_borrow_environment_entry_value_by_name_const(this->libObjPtr(), name);
827 return ConstValue {libObjPtr};
830 return nonstd::nullopt;
833 nonstd::optional<ConstValue> environmentEntry(const std::string& name) const noexcept
835 return this->environmentEntry(name.data());
838 template <typename LibValT>
839 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
841 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTrace`.");
843 bt_trace_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
846 UserAttributes userAttributes() const noexcept
848 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
851 Shared shared() const noexcept
853 return Shared::createWithRef(*this);
857 using Trace = CommonTrace<bt_trace>;
858 using ConstTrace = CommonTrace<const bt_trace>;
862 struct TraceTypeDescr
864 using Const = ConstTrace;
865 using NonConst = Trace;
869 struct TypeDescr<Trace> : public TraceTypeDescr
874 struct TypeDescr<ConstTrace> : public TraceTypeDescr
878 } /* namespace internal */
880 template <typename LibObjT>
881 typename CommonStream<LibObjT>::_Trace CommonStream<LibObjT>::trace() const noexcept
883 return _Trace {_Spec::trace(this->libObjPtr())};
888 struct EventClassRefFuncs final
890 static void get(const bt_event_class * const libObjPtr) noexcept
892 bt_event_class_get_ref(libObjPtr);
895 static void put(const bt_event_class * const libObjPtr) noexcept
897 bt_event_class_put_ref(libObjPtr);
901 template <typename LibObjT>
902 struct CommonEventClassSpec;
904 /* Functions specific to mutable event classes */
906 struct CommonEventClassSpec<bt_event_class> final
908 static bt_stream_class *streamClass(bt_event_class * const libObjPtr) noexcept
910 return bt_event_class_borrow_stream_class(libObjPtr);
913 static bt_field_class *payloadFieldClass(bt_event_class * const libObjPtr) noexcept
915 return bt_event_class_borrow_payload_field_class(libObjPtr);
918 static bt_field_class *specificContextFieldClass(bt_event_class * const libObjPtr) noexcept
920 return bt_event_class_borrow_specific_context_field_class(libObjPtr);
923 static bt_value *userAttributes(bt_event_class * const libObjPtr) noexcept
925 return bt_event_class_borrow_user_attributes(libObjPtr);
929 /* Functions specific to constant event classes */
931 struct CommonEventClassSpec<const bt_event_class> final
933 static const bt_stream_class *streamClass(const bt_event_class * const libObjPtr) noexcept
935 return bt_event_class_borrow_stream_class_const(libObjPtr);
938 static const bt_field_class *payloadFieldClass(const bt_event_class * const libObjPtr) noexcept
940 return bt_event_class_borrow_payload_field_class_const(libObjPtr);
943 static const bt_field_class *
944 specificContextFieldClass(const bt_event_class * const libObjPtr) noexcept
946 return bt_event_class_borrow_specific_context_field_class_const(libObjPtr);
949 static const bt_value *userAttributes(const bt_event_class * const libObjPtr) noexcept
951 return bt_event_class_borrow_user_attributes_const(libObjPtr);
955 } /* namespace internal */
957 template <typename LibObjT>
958 class CommonEventClass final : public BorrowedObject<LibObjT>
961 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
962 using typename BorrowedObject<LibObjT>::_LibObjPtr;
963 using _Spec = internal::CommonEventClassSpec<LibObjT>;
964 using _ThisCommonEventClass = CommonEventClass<LibObjT>;
966 using _StreamClass = typename std::conditional<std::is_const<LibObjT>::value,
967 CommonStreamClass<const bt_stream_class>,
968 CommonStreamClass<bt_stream_class>>::type;
970 using _StructureFieldClass =
971 typename std::conditional<std::is_const<LibObjT>::value, ConstStructureFieldClass,
972 StructureFieldClass>::type;
975 using Shared = SharedObject<_ThisCommonEventClass, LibObjT, internal::EventClassRefFuncs>;
977 using UserAttributes =
978 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
982 EMERGENCY = BT_EVENT_CLASS_LOG_LEVEL_EMERGENCY,
983 ALERT = BT_EVENT_CLASS_LOG_LEVEL_ALERT,
984 CRITICAL = BT_EVENT_CLASS_LOG_LEVEL_CRITICAL,
985 ERR = BT_EVENT_CLASS_LOG_LEVEL_ERROR,
986 WARNING = BT_EVENT_CLASS_LOG_LEVEL_WARNING,
987 NOTICE = BT_EVENT_CLASS_LOG_LEVEL_NOTICE,
988 INFO = BT_EVENT_CLASS_LOG_LEVEL_INFO,
989 DEBUG_SYSTEM = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_SYSTEM,
990 DEBUG_PROGRAM = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROGRAM,
991 DEBUG_PROC = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROCESS,
992 DEBUG_MODULE = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_MODULE,
993 DEBUG_UNIT = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_UNIT,
994 DEBUG_FUNCTION = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_FUNCTION,
995 DEBUG_LINE = BT_EVENT_CLASS_LOG_LEVEL_DEBUG_LINE,
996 DEBUG = BT_EVENT_CLASS_LOG_LEVEL_DEBUG,
999 explicit CommonEventClass(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
1003 template <typename OtherLibObjT>
1004 CommonEventClass(const CommonEventClass<OtherLibObjT> eventClass) noexcept :
1005 _ThisBorrowedObject {eventClass}
1009 template <typename OtherLibObjT>
1010 _ThisCommonEventClass& operator=(const CommonEventClass<OtherLibObjT> eventClass) noexcept
1012 _ThisBorrowedObject::operator=(eventClass);
1016 CommonEventClass<const bt_event_class> asConst() const noexcept
1018 return CommonEventClass<const bt_event_class> {*this};
1021 _StreamClass streamClass() const noexcept;
1023 std::uint64_t id() const noexcept
1025 return bt_event_class_get_id(this->libObjPtr());
1028 void name(const char * const name) const
1030 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1032 const auto status = bt_event_class_set_name(this->libObjPtr(), name);
1034 if (status == BT_EVENT_CLASS_SET_NAME_STATUS_MEMORY_ERROR) {
1035 throw MemoryError {};
1039 void name(const std::string& name) const
1041 this->name(name.data());
1044 nonstd::optional<bpstd::string_view> name() const noexcept
1046 const auto name = bt_event_class_get_name(this->libObjPtr());
1052 return nonstd::nullopt;
1055 void logLevel(const LogLevel logLevel) const noexcept
1057 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1059 bt_event_class_set_log_level(this->libObjPtr(),
1060 static_cast<bt_event_class_log_level>(logLevel));
1063 nonstd::optional<LogLevel> logLevel() const noexcept
1065 bt_event_class_log_level libLogLevel;
1066 const auto avail = bt_event_class_get_log_level(this->libObjPtr(), &libLogLevel);
1068 if (avail == BT_PROPERTY_AVAILABILITY_AVAILABLE) {
1069 return static_cast<LogLevel>(libLogLevel);
1072 return nonstd::nullopt;
1075 void emfUri(const char * const emfUri) const
1077 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1079 const auto status = bt_event_class_set_emf_uri(this->libObjPtr(), emfUri);
1081 if (status == BT_EVENT_CLASS_SET_EMF_URI_STATUS_MEMORY_ERROR) {
1082 throw MemoryError {};
1086 void emfUri(const std::string& emfUri) const
1088 this->emfUri(emfUri.data());
1091 nonstd::optional<bpstd::string_view> emfUri() const noexcept
1093 const auto emfUri = bt_event_class_get_emf_uri(this->libObjPtr());
1099 return nonstd::nullopt;
1102 void payloadFieldClass(const StructureFieldClass fc) const
1104 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1107 bt_event_class_set_payload_field_class(this->libObjPtr(), fc.libObjPtr());
1109 if (status == BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1110 throw MemoryError {};
1114 nonstd::optional<_StructureFieldClass> payloadFieldClass() const noexcept
1116 const auto libObjPtr = _Spec::payloadFieldClass(this->libObjPtr());
1119 return _StructureFieldClass {libObjPtr};
1122 return nonstd::nullopt;
1125 void specificContextFieldClass(const StructureFieldClass fc) const
1127 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1130 bt_event_class_set_specific_context_field_class(this->libObjPtr(), fc.libObjPtr());
1132 if (status == BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1133 throw MemoryError {};
1137 nonstd::optional<_StructureFieldClass> specificContextFieldClass() const noexcept
1139 const auto libObjPtr = _Spec::specificContextFieldClass(this->libObjPtr());
1142 return _StructureFieldClass {libObjPtr};
1145 return nonstd::nullopt;
1148 template <typename LibValT>
1149 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
1151 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstEventClass`.");
1153 bt_event_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
1156 UserAttributes userAttributes() const noexcept
1158 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
1161 Shared shared() const noexcept
1163 return Shared::createWithRef(*this);
1167 using EventClass = CommonEventClass<bt_event_class>;
1168 using ConstEventClass = CommonEventClass<const bt_event_class>;
1170 namespace internal {
1172 struct EventClassTypeDescr
1174 using Const = ConstEventClass;
1175 using NonConst = EventClass;
1179 struct TypeDescr<EventClass> : public EventClassTypeDescr
1184 struct TypeDescr<ConstEventClass> : public EventClassTypeDescr
1188 } /* namespace internal */
1190 template <typename LibObjT>
1191 typename CommonEvent<LibObjT>::Class CommonEvent<LibObjT>::cls() const noexcept
1193 return Class {_Spec::cls(this->libObjPtr())};
1196 namespace internal {
1198 struct StreamClassRefFuncs final
1200 static void get(const bt_stream_class * const libObjPtr) noexcept
1202 bt_stream_class_get_ref(libObjPtr);
1205 static void put(const bt_stream_class * const libObjPtr) noexcept
1207 bt_stream_class_put_ref(libObjPtr);
1211 template <typename LibObjT>
1212 struct CommonStreamClassSpec;
1214 /* Functions specific to mutable stream classes */
1216 struct CommonStreamClassSpec<bt_stream_class> final
1218 static bt_trace_class *traceClass(bt_stream_class * const libObjPtr) noexcept
1220 return bt_stream_class_borrow_trace_class(libObjPtr);
1223 static bt_event_class *eventClassByIndex(bt_stream_class * const libObjPtr,
1224 const std::uint64_t index) noexcept
1226 return bt_stream_class_borrow_event_class_by_index(libObjPtr, index);
1229 static bt_event_class *eventClassById(bt_stream_class * const libObjPtr,
1230 const std::uint64_t id) noexcept
1232 return bt_stream_class_borrow_event_class_by_id(libObjPtr, id);
1235 static bt_clock_class *defaultClockClass(bt_stream_class * const libObjPtr) noexcept
1237 return bt_stream_class_borrow_default_clock_class(libObjPtr);
1240 static bt_field_class *packetContextFieldClass(bt_stream_class * const libObjPtr) noexcept
1242 return bt_stream_class_borrow_packet_context_field_class(libObjPtr);
1245 static bt_field_class *eventCommonContextFieldClass(bt_stream_class * const libObjPtr) noexcept
1247 return bt_stream_class_borrow_event_common_context_field_class(libObjPtr);
1250 static bt_value *userAttributes(bt_stream_class * const libObjPtr) noexcept
1252 return bt_stream_class_borrow_user_attributes(libObjPtr);
1256 /* Functions specific to constant stream classes */
1258 struct CommonStreamClassSpec<const bt_stream_class> final
1260 static const bt_trace_class *traceClass(const bt_stream_class * const libObjPtr) noexcept
1262 return bt_stream_class_borrow_trace_class_const(libObjPtr);
1265 static const bt_event_class *eventClassByIndex(const bt_stream_class * const libObjPtr,
1266 const std::uint64_t index) noexcept
1268 return bt_stream_class_borrow_event_class_by_index_const(libObjPtr, index);
1271 static const bt_event_class *eventClassById(const bt_stream_class * const libObjPtr,
1272 const std::uint64_t id) noexcept
1274 return bt_stream_class_borrow_event_class_by_id_const(libObjPtr, id);
1277 static const bt_clock_class *defaultClockClass(const bt_stream_class * const libObjPtr) noexcept
1279 return bt_stream_class_borrow_default_clock_class_const(libObjPtr);
1282 static const bt_field_class *
1283 packetContextFieldClass(const bt_stream_class * const libObjPtr) noexcept
1285 return bt_stream_class_borrow_packet_context_field_class_const(libObjPtr);
1288 static const bt_field_class *
1289 eventCommonContextFieldClass(const bt_stream_class * const libObjPtr) noexcept
1291 return bt_stream_class_borrow_event_common_context_field_class_const(libObjPtr);
1294 static const bt_value *userAttributes(const bt_stream_class * const libObjPtr) noexcept
1296 return bt_stream_class_borrow_user_attributes_const(libObjPtr);
1300 } /* namespace internal */
1302 template <typename LibObjT>
1303 class CommonStreamClass final : public BorrowedObject<LibObjT>
1306 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
1307 using typename BorrowedObject<LibObjT>::_LibObjPtr;
1308 using _Spec = internal::CommonStreamClassSpec<LibObjT>;
1309 using _ThisCommonStreamClass = CommonStreamClass<LibObjT>;
1311 using _TraceClass = typename std::conditional<std::is_const<LibObjT>::value,
1312 CommonTraceClass<const bt_trace_class>,
1313 CommonTraceClass<bt_trace_class>>::type;
1315 using _EventClass = typename std::conditional<std::is_const<LibObjT>::value,
1316 CommonEventClass<const bt_event_class>,
1317 CommonEventClass<bt_event_class>>::type;
1319 using _StructureFieldClass =
1320 typename std::conditional<std::is_const<LibObjT>::value, ConstStructureFieldClass,
1321 StructureFieldClass>::type;
1324 typename std::conditional<std::is_const<LibObjT>::value, ConstClockClass, ClockClass>::type;
1327 using Shared = SharedObject<_ThisCommonStreamClass, LibObjT, internal::StreamClassRefFuncs>;
1329 using UserAttributes =
1330 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
1332 explicit CommonStreamClass(const _LibObjPtr libObjPtr) noexcept :
1333 _ThisBorrowedObject {libObjPtr}
1337 template <typename OtherLibObjT>
1338 CommonStreamClass(const CommonStreamClass<OtherLibObjT> streamClass) noexcept :
1339 _ThisBorrowedObject {streamClass}
1343 template <typename OtherLibObjT>
1344 _ThisCommonStreamClass& operator=(const CommonStreamClass<OtherLibObjT> streamClass) noexcept
1346 _ThisBorrowedObject::operator=(streamClass);
1350 CommonStreamClass<const bt_stream_class> asConst() const noexcept
1352 return CommonStreamClass<const bt_stream_class> {*this};
1355 Stream::Shared instantiate(const Trace trace) const
1357 static_assert(!std::is_const<LibObjT>::value,
1358 "Not available with `bt2::ConstStreamClass`.");
1360 const auto libObjPtr = bt_stream_create(this->libObjPtr(), trace.libObjPtr());
1362 internal::validateCreatedObjPtr(libObjPtr);
1363 return Stream::Shared::createWithoutRef(libObjPtr);
1366 Stream::Shared instantiate(const Trace trace, const std::uint64_t id) const
1368 static_assert(!std::is_const<LibObjT>::value,
1369 "Not available with `bt2::ConstStreamClass`.");
1371 const auto libObjPtr = bt_stream_create_with_id(this->libObjPtr(), trace.libObjPtr(), id);
1373 internal::validateCreatedObjPtr(libObjPtr);
1374 return Stream::Shared::createWithoutRef(libObjPtr);
1377 EventClass::Shared createEventClass() const
1379 static_assert(!std::is_const<LibObjT>::value,
1380 "Not available with `bt2::ConstStreamClass`.");
1382 const auto libObjPtr = bt_event_class_create(this->libObjPtr());
1384 internal::validateCreatedObjPtr(libObjPtr);
1385 return EventClass::Shared::createWithoutRef(libObjPtr);
1388 EventClass::Shared createEventClass(const std::uint64_t id) const
1390 static_assert(!std::is_const<LibObjT>::value,
1391 "Not available with `bt2::ConstStreamClass`.");
1393 const auto libObjPtr = bt_event_class_create_with_id(this->libObjPtr(), id);
1395 internal::validateCreatedObjPtr(libObjPtr);
1396 return EventClass::Shared::createWithoutRef(libObjPtr);
1399 _TraceClass traceClass() const noexcept;
1401 std::uint64_t id() const noexcept
1403 return bt_stream_class_get_id(this->libObjPtr());
1406 void name(const char * const name) const
1408 static_assert(!std::is_const<LibObjT>::value,
1409 "Not available with `bt2::ConstStreamClass`.");
1411 const auto status = bt_stream_class_set_name(this->libObjPtr(), name);
1413 if (status == BT_STREAM_CLASS_SET_NAME_STATUS_MEMORY_ERROR) {
1414 throw MemoryError {};
1418 void name(const std::string& name) const
1420 this->name(name.data());
1423 nonstd::optional<bpstd::string_view> name() const noexcept
1425 const auto name = bt_stream_class_get_name(this->libObjPtr());
1431 return nonstd::nullopt;
1434 void assignsAutomaticEventClassId(const bool val) const noexcept
1436 static_assert(!std::is_const<LibObjT>::value,
1437 "Not available with `bt2::ConstStreamClass`.");
1439 bt_stream_class_set_assigns_automatic_event_class_id(this->libObjPtr(),
1440 static_cast<bt_bool>(val));
1443 bool assignsAutomaticEventClassId() const noexcept
1445 return static_cast<bool>(
1446 bt_stream_class_assigns_automatic_event_class_id(this->libObjPtr()));
1449 void assignsAutomaticStreamId(const bool val) const noexcept
1451 static_assert(!std::is_const<LibObjT>::value,
1452 "Not available with `bt2::ConstStreamClass`.");
1454 bt_stream_class_set_assigns_automatic_stream_id(this->libObjPtr(),
1455 static_cast<bt_bool>(val));
1458 bool assignsAutomaticStreamId() const noexcept
1460 return static_cast<bool>(bt_stream_class_assigns_automatic_stream_id(this->libObjPtr()));
1463 void supportsPackets(const bool supportsPackets, const bool withBeginningDefaultClkSnapshot,
1464 const bool withEndDefaultClkSnapshot) const noexcept
1466 static_assert(!std::is_const<LibObjT>::value,
1467 "Not available with `bt2::ConstStreamClass`.");
1469 bt_stream_class_set_supports_packets(this->libObjPtr(),
1470 static_cast<bt_bool>(supportsPackets),
1471 static_cast<bt_bool>(withBeginningDefaultClkSnapshot),
1472 static_cast<bt_bool>(withEndDefaultClkSnapshot));
1475 bool supportsPackets() const noexcept
1477 return static_cast<bool>(bt_stream_class_supports_packets(this->libObjPtr()));
1480 bool packetsHaveBeginningClockSnapshot() const noexcept
1482 return static_cast<bool>(
1483 bt_stream_class_packets_have_beginning_default_clock_snapshot(this->libObjPtr()));
1486 bool packetsHaveEndClockSnapshot() const noexcept
1488 return static_cast<bool>(
1489 bt_stream_class_packets_have_end_default_clock_snapshot(this->libObjPtr()));
1492 void supportsDiscardedEvents(const bool supportsDiscardedEvents,
1493 const bool withDefaultClkSnapshots) const noexcept
1495 static_assert(!std::is_const<LibObjT>::value,
1496 "Not available with `bt2::ConstStreamClass`.");
1498 bt_stream_class_set_supports_discarded_events(
1499 this->libObjPtr(), static_cast<bt_bool>(supportsDiscardedEvents),
1500 static_cast<bt_bool>(withDefaultClkSnapshots));
1503 bool supportsDiscardedEvents() const noexcept
1505 return static_cast<bool>(bt_stream_class_supports_discarded_events(this->libObjPtr()));
1508 bool discardedEventsHaveDefaultClockSnapshots() const noexcept
1510 return static_cast<bool>(
1511 bt_stream_class_discarded_events_have_default_clock_snapshots(this->libObjPtr()));
1514 void supportsDiscardedPackets(const bool supportsDiscardedPackets,
1515 const bool withDefaultClkSnapshots) const noexcept
1517 static_assert(!std::is_const<LibObjT>::value,
1518 "Not available with `bt2::ConstStreamClass`.");
1520 bt_stream_class_set_supports_discarded_packets(
1521 this->libObjPtr(), static_cast<bt_bool>(supportsDiscardedPackets),
1522 static_cast<bt_bool>(withDefaultClkSnapshots));
1525 bool supportsDiscardedPackets() const noexcept
1527 return static_cast<bool>(bt_stream_class_supports_discarded_packets(this->libObjPtr()));
1530 bool discardedPacketsHaveDefaultClockSnapshots() const noexcept
1532 return static_cast<bool>(
1533 bt_stream_class_discarded_packets_have_default_clock_snapshots(this->libObjPtr()));
1536 void defaultClockClass(const ClockClass clkCls) const
1538 static_assert(!std::is_const<LibObjT>::value,
1539 "Not available with `bt2::ConstStreamClass`.");
1542 bt_stream_class_set_default_clock_class(this->libObjPtr(), clkCls.libObjPtr());
1544 BT_ASSERT(status == BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK);
1547 nonstd::optional<_ClockClass> defaultClockClass() const noexcept
1549 const auto libObjPtr = _Spec::defaultClockClass(this->libObjPtr());
1552 return _ClockClass {libObjPtr};
1555 return nonstd::nullopt;
1558 std::uint64_t length() const noexcept
1560 return bt_stream_class_get_event_class_count(this->libObjPtr());
1563 _EventClass operator[](const std::uint64_t index) const noexcept
1565 return _EventClass {_Spec::eventClassByIndex(this->libObjPtr(), index)};
1568 nonstd::optional<_EventClass> eventClassById(const std::uint64_t id) const noexcept
1570 const auto libObjPtr = _Spec::eventClassById(this->libObjPtr(), id);
1573 return _EventClass {libObjPtr};
1576 return nonstd::nullopt;
1579 void packetContextFieldClass(const StructureFieldClass fc) const
1581 static_assert(!std::is_const<LibObjT>::value,
1582 "Not available with `bt2::ConstStreamClass`.");
1585 bt_stream_class_set_packet_context_field_class(this->libObjPtr(), fc.libObjPtr());
1587 if (status == BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1588 throw MemoryError {};
1592 nonstd::optional<_StructureFieldClass> packetContextFieldClass() const noexcept
1594 const auto libObjPtr = _Spec::packetContextFieldClass(this->libObjPtr());
1597 return _StructureFieldClass {libObjPtr};
1600 return nonstd::nullopt;
1603 void eventCommonContextFieldClass(const StructureFieldClass fc) const
1605 static_assert(!std::is_const<LibObjT>::value,
1606 "Not available with `bt2::ConstStreamClass`.");
1609 bt_stream_class_set_event_common_context_field_class(this->libObjPtr(), fc.libObjPtr());
1611 if (status == BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR) {
1612 throw MemoryError {};
1616 nonstd::optional<_StructureFieldClass> eventCommonContextFieldClass() const noexcept
1618 const auto libObjPtr = _Spec::eventCommonContextFieldClass(this->libObjPtr());
1621 return _StructureFieldClass {libObjPtr};
1624 return nonstd::nullopt;
1627 template <typename LibValT>
1628 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
1630 static_assert(!std::is_const<LibObjT>::value,
1631 "Not available with `bt2::ConstStreamClass`.");
1633 bt_stream_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
1636 UserAttributes userAttributes() const noexcept
1638 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
1641 Shared shared() const noexcept
1643 return Shared::createWithRef(*this);
1647 using StreamClass = CommonStreamClass<bt_stream_class>;
1648 using ConstStreamClass = CommonStreamClass<const bt_stream_class>;
1650 namespace internal {
1652 struct StreamClassTypeDescr
1654 using Const = ConstStreamClass;
1655 using NonConst = StreamClass;
1659 struct TypeDescr<StreamClass> : public StreamClassTypeDescr
1664 struct TypeDescr<ConstStreamClass> : public StreamClassTypeDescr
1668 } /* namespace internal */
1670 template <typename LibObjT>
1671 typename CommonEventClass<LibObjT>::_StreamClass
1672 CommonEventClass<LibObjT>::streamClass() const noexcept
1674 return _StreamClass {_Spec::streamClass(this->libObjPtr())};
1677 template <typename LibObjT>
1678 typename CommonStream<LibObjT>::Class CommonStream<LibObjT>::cls() const noexcept
1680 return Class {_Spec::cls(this->libObjPtr())};
1683 namespace internal {
1685 struct TraceClassRefFuncs final
1687 static void get(const bt_trace_class * const libObjPtr) noexcept
1689 bt_trace_class_get_ref(libObjPtr);
1692 static void put(const bt_trace_class * const libObjPtr) noexcept
1694 bt_trace_class_put_ref(libObjPtr);
1698 template <typename LibObjT>
1699 struct CommonTraceClassSpec;
1701 /* Functions specific to mutable stream classes */
1703 struct CommonTraceClassSpec<bt_trace_class> final
1705 static bt_stream_class *streamClassByIndex(bt_trace_class * const libObjPtr,
1706 const std::uint64_t index) noexcept
1708 return bt_trace_class_borrow_stream_class_by_index(libObjPtr, index);
1711 static bt_stream_class *streamClassById(bt_trace_class * const libObjPtr,
1712 const std::uint64_t id) noexcept
1714 return bt_trace_class_borrow_stream_class_by_id(libObjPtr, id);
1717 static bt_value *userAttributes(bt_trace_class * const libObjPtr) noexcept
1719 return bt_trace_class_borrow_user_attributes(libObjPtr);
1723 /* Functions specific to constant stream classes */
1725 struct CommonTraceClassSpec<const bt_trace_class> final
1727 static const bt_stream_class *streamClassByIndex(const bt_trace_class * const libObjPtr,
1728 const std::uint64_t index) noexcept
1730 return bt_trace_class_borrow_stream_class_by_index_const(libObjPtr, index);
1733 static const bt_stream_class *streamClassById(const bt_trace_class * const libObjPtr,
1734 const std::uint64_t id) noexcept
1736 return bt_trace_class_borrow_stream_class_by_id_const(libObjPtr, id);
1739 static const bt_value *userAttributes(const bt_trace_class * const libObjPtr) noexcept
1741 return bt_trace_class_borrow_user_attributes_const(libObjPtr);
1745 } /* namespace internal */
1747 template <typename LibObjT>
1748 class CommonTraceClass final : public BorrowedObject<LibObjT>
1751 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
1752 using typename BorrowedObject<LibObjT>::_LibObjPtr;
1753 using _Spec = internal::CommonTraceClassSpec<LibObjT>;
1754 using _ThisCommonTraceClass = CommonTraceClass<LibObjT>;
1756 using _StreamClass = typename std::conditional<std::is_const<LibObjT>::value,
1757 CommonStreamClass<const bt_stream_class>,
1758 CommonStreamClass<bt_stream_class>>::type;
1761 using Shared = SharedObject<_ThisCommonTraceClass, LibObjT, internal::TraceClassRefFuncs>;
1763 using UserAttributes =
1764 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
1766 explicit CommonTraceClass(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
1770 template <typename OtherLibObjT>
1771 CommonTraceClass(const CommonTraceClass<OtherLibObjT> traceClass) noexcept :
1772 _ThisBorrowedObject {traceClass}
1776 template <typename OtherLibObjT>
1777 _ThisCommonTraceClass& operator=(const CommonTraceClass<OtherLibObjT> traceClass) noexcept
1779 _ThisBorrowedObject::operator=(traceClass);
1783 CommonTraceClass<const bt_trace_class> asConst() const noexcept
1785 return CommonTraceClass<const bt_trace_class> {*this};
1788 Trace::Shared instantiate() const
1790 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1792 const auto libObjPtr = bt_trace_create(this->libObjPtr());
1794 internal::validateCreatedObjPtr(libObjPtr);
1795 return Trace::Shared::createWithoutRef(libObjPtr);
1798 StreamClass::Shared createStreamClass() const
1800 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1802 const auto libObjPtr = bt_stream_class_create(this->libObjPtr());
1804 internal::validateCreatedObjPtr(libObjPtr);
1805 return StreamClass::Shared::createWithoutRef(libObjPtr);
1808 StreamClass::Shared createStreamClass(const std::uint64_t id) const
1810 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1812 const auto libObjPtr = bt_stream_class_create_with_id(this->libObjPtr(), id);
1814 internal::validateCreatedObjPtr(libObjPtr);
1815 return StreamClass::Shared::createWithoutRef(libObjPtr);
1818 FieldClass::Shared createBoolFieldClass() const
1820 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1822 const auto libObjPtr = bt_field_class_bool_create(this->libObjPtr());
1824 internal::validateCreatedObjPtr(libObjPtr);
1825 return FieldClass::Shared::createWithoutRef(libObjPtr);
1828 BitArrayFieldClass::Shared createBitArrayFieldClass(const std::uint64_t length) const
1830 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1832 const auto libObjPtr = bt_field_class_bit_array_create(this->libObjPtr(), length);
1834 internal::validateCreatedObjPtr(libObjPtr);
1835 return BitArrayFieldClass::Shared::createWithoutRef(libObjPtr);
1838 IntegerFieldClass::Shared createUnsignedIntegerFieldClass() const
1840 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1842 const auto libObjPtr = bt_field_class_integer_unsigned_create(this->libObjPtr());
1844 internal::validateCreatedObjPtr(libObjPtr);
1845 return IntegerFieldClass::Shared::createWithoutRef(libObjPtr);
1848 IntegerFieldClass::Shared createSignedIntegerFieldClass() const
1850 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1852 const auto libObjPtr = bt_field_class_integer_signed_create(this->libObjPtr());
1854 internal::validateCreatedObjPtr(libObjPtr);
1855 return IntegerFieldClass::Shared::createWithoutRef(libObjPtr);
1858 UnsignedEnumerationFieldClass::Shared createUnsignedEnumerationFieldClass() const
1860 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1862 const auto libObjPtr = bt_field_class_enumeration_unsigned_create(this->libObjPtr());
1864 internal::validateCreatedObjPtr(libObjPtr);
1865 return UnsignedEnumerationFieldClass::Shared::createWithoutRef(libObjPtr);
1868 SignedEnumerationFieldClass::Shared createSignedEnumerationFieldClass() const
1870 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1872 const auto libObjPtr = bt_field_class_enumeration_signed_create(this->libObjPtr());
1874 internal::validateCreatedObjPtr(libObjPtr);
1875 return SignedEnumerationFieldClass::Shared::createWithoutRef(libObjPtr);
1878 FieldClass::Shared createSinglePrecisionRealFieldClass() const
1880 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1882 const auto libObjPtr = bt_field_class_real_single_precision_create(this->libObjPtr());
1884 internal::validateCreatedObjPtr(libObjPtr);
1885 return FieldClass::Shared::createWithoutRef(libObjPtr);
1888 FieldClass::Shared createDoublePrecisionRealFieldClass() const
1890 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1892 const auto libObjPtr = bt_field_class_real_double_precision_create(this->libObjPtr());
1894 internal::validateCreatedObjPtr(libObjPtr);
1895 return FieldClass::Shared::createWithoutRef(libObjPtr);
1898 FieldClass::Shared createStringFieldClass() const
1900 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1902 const auto libObjPtr = bt_field_class_string_create(this->libObjPtr());
1904 internal::validateCreatedObjPtr(libObjPtr);
1905 return FieldClass::Shared::createWithoutRef(libObjPtr);
1908 StaticArrayFieldClass::Shared createStaticArrayFieldClass(const FieldClass elementFieldClass,
1909 const std::uint64_t length) const
1911 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1913 const auto libObjPtr = bt_field_class_array_static_create(
1914 this->libObjPtr(), elementFieldClass.libObjPtr(), length);
1916 internal::validateCreatedObjPtr(libObjPtr);
1917 return StaticArrayFieldClass::Shared::createWithoutRef(libObjPtr);
1920 ArrayFieldClass::Shared createDynamicArrayFieldClass(const FieldClass elementFieldClass) const
1922 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1924 const auto libObjPtr = bt_field_class_array_dynamic_create(
1925 this->libObjPtr(), elementFieldClass.libObjPtr(), nullptr);
1927 internal::validateCreatedObjPtr(libObjPtr);
1928 return ArrayFieldClass::Shared::createWithoutRef(libObjPtr);
1931 DynamicArrayWithLengthFieldClass::Shared
1932 createDynamicArrayFieldClass(const FieldClass elementFieldClass,
1933 const IntegerFieldClass lengthFieldClass) const
1935 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1937 const auto libObjPtr = bt_field_class_array_dynamic_create(
1938 this->libObjPtr(), elementFieldClass.libObjPtr(), lengthFieldClass.libObjPtr());
1940 internal::validateCreatedObjPtr(libObjPtr);
1941 return DynamicArrayWithLengthFieldClass::Shared::createWithoutRef(libObjPtr);
1944 StructureFieldClass::Shared createStructureFieldClass() const
1946 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1948 const auto libObjPtr = bt_field_class_structure_create(this->libObjPtr());
1950 internal::validateCreatedObjPtr(libObjPtr);
1951 return StructureFieldClass::Shared::createWithoutRef(libObjPtr);
1954 OptionFieldClass::Shared createOptionFieldClass(const FieldClass optionalFieldClass) const
1956 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1958 const auto libObjPtr = bt_field_class_option_without_selector_create(
1959 this->libObjPtr(), optionalFieldClass.libObjPtr());
1961 internal::validateCreatedObjPtr(libObjPtr);
1962 return OptionFieldClass::Shared::createWithoutRef(libObjPtr);
1965 OptionWithBoolSelectorFieldClass::Shared
1966 createOptionWithBoolSelectorFieldClass(const FieldClass optionalFieldClass,
1967 const FieldClass selectorFieldClass) const
1969 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1971 const auto libObjPtr = bt_field_class_option_with_selector_field_bool_create(
1972 this->libObjPtr(), optionalFieldClass.libObjPtr(), selectorFieldClass.libObjPtr());
1974 internal::validateCreatedObjPtr(libObjPtr);
1975 return OptionWithBoolSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
1978 OptionWithUnsignedIntegerSelectorFieldClass::Shared
1979 createOptionWithUnsignedIntegerSelectorFieldClass(
1980 const FieldClass optionalFieldClass, const IntegerFieldClass selectorFieldClass,
1981 const ConstUnsignedIntegerRangeSet ranges) const
1983 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
1985 const auto libObjPtr = bt_field_class_option_with_selector_field_integer_unsigned_create(
1986 this->libObjPtr(), optionalFieldClass.libObjPtr(), selectorFieldClass.libObjPtr(),
1987 ranges.libObjPtr());
1989 internal::validateCreatedObjPtr(libObjPtr);
1990 return OptionWithUnsignedIntegerSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
1993 OptionWithSignedIntegerSelectorFieldClass::Shared
1994 createOptionWithSignedIntegerSelectorFieldClass(const FieldClass optionalFieldClass,
1995 const IntegerFieldClass selectorFieldClass,
1996 const ConstSignedIntegerRangeSet ranges) const
1998 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
2000 const auto libObjPtr = bt_field_class_option_with_selector_field_integer_signed_create(
2001 this->libObjPtr(), optionalFieldClass.libObjPtr(), selectorFieldClass.libObjPtr(),
2002 ranges.libObjPtr());
2004 internal::validateCreatedObjPtr(libObjPtr);
2005 return OptionWithSignedIntegerSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
2008 VariantWithoutSelectorFieldClass::Shared createVariantFieldClass() const
2010 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
2012 const auto libObjPtr = bt_field_class_variant_create(this->libObjPtr(), nullptr);
2014 internal::validateCreatedObjPtr(libObjPtr);
2015 return VariantWithoutSelectorFieldClass::Shared::createWithoutRef(libObjPtr);
2018 VariantWithUnsignedIntegerSelectorFieldClass::Shared
2019 createVariantWithUnsignedIntegerSelectorFieldClass(
2020 const IntegerFieldClass selectorFieldClass) const
2022 return this->_createVariantWithIntegerSelectorFieldClass<
2023 VariantWithUnsignedIntegerSelectorFieldClass>(selectorFieldClass);
2026 VariantWithSignedIntegerSelectorFieldClass::Shared
2027 createVariantWithSignedIntegerSelectorFieldClass(
2028 const IntegerFieldClass selectorFieldClass) const
2030 return this->_createVariantWithIntegerSelectorFieldClass<
2031 VariantWithSignedIntegerSelectorFieldClass>(selectorFieldClass);
2034 void assignsAutomaticStreamClassId(const bool val) const noexcept
2036 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
2038 bt_trace_class_set_assigns_automatic_stream_class_id(this->libObjPtr(),
2039 static_cast<bt_bool>(val));
2042 bool assignsAutomaticStreamClassId() const noexcept
2044 return static_cast<bool>(
2045 bt_trace_class_assigns_automatic_stream_class_id(this->libObjPtr()));
2048 std::uint64_t length() const noexcept
2050 return bt_trace_class_get_stream_class_count(this->libObjPtr());
2053 _StreamClass operator[](const std::uint64_t index) const noexcept
2055 return _StreamClass {_Spec::streamClassByIndex(this->libObjPtr(), index)};
2058 nonstd::optional<_StreamClass> streamClassById(const std::uint64_t id) const noexcept
2060 const auto libObjPtr = _Spec::streamClassById(this->libObjPtr(), id);
2063 return _StreamClass {libObjPtr};
2066 return nonstd::nullopt;
2069 template <typename LibValT>
2070 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
2072 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
2074 bt_trace_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
2077 UserAttributes userAttributes() const noexcept
2079 return UserAttributes {_Spec::userAttributes(this->libObjPtr())};
2082 Shared shared() const noexcept
2084 return Shared::createWithRef(*this);
2088 template <typename ObjT>
2089 typename ObjT::Shared
2090 _createVariantWithIntegerSelectorFieldClass(const IntegerFieldClass selectorFieldClass) const
2092 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstTraceClass`.");
2094 const auto libObjPtr =
2095 bt_field_class_variant_create(this->libObjPtr(), selectorFieldClass.libObjPtr());
2097 internal::validateCreatedObjPtr(libObjPtr);
2098 return ObjT::Shared::createWithoutRef(libObjPtr);
2102 using TraceClass = CommonTraceClass<bt_trace_class>;
2103 using ConstTraceClass = CommonTraceClass<const bt_trace_class>;
2105 namespace internal {
2107 struct TraceClassTypeDescr
2109 using Const = ConstTraceClass;
2110 using NonConst = TraceClass;
2114 struct TypeDescr<TraceClass> : public TraceClassTypeDescr
2119 struct TypeDescr<ConstTraceClass> : public TraceClassTypeDescr
2123 } /* namespace internal */
2125 template <typename LibObjT>
2126 typename CommonStreamClass<LibObjT>::_TraceClass
2127 CommonStreamClass<LibObjT>::traceClass() const noexcept
2129 return _TraceClass {_Spec::traceClass(this->libObjPtr())};
2132 template <typename LibObjT>
2133 typename CommonTrace<LibObjT>::Class CommonTrace<LibObjT>::cls() const noexcept
2135 return Class {_Spec::cls(this->libObjPtr())};
2138 } /* namespace bt2 */
2140 #endif /* BABELTRACE_CPP_COMMON_BT2_TRACE_IR_HPP */