cpp-common/bt2: add bt2::CommonEventMessage::streamClassDefaultClockClass()
[babeltrace.git] / src / cpp-common / bt2 / message.hpp
CommitLineData
508053d4
PP
1/*
2 * Copyright (c) 2021 Philippe Proulx <pproulx@efficios.com>
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7#ifndef BABELTRACE_CPP_COMMON_BT2_MESSAGE_HPP
8#define BABELTRACE_CPP_COMMON_BT2_MESSAGE_HPP
9
508053d4 10#include <cstdint>
c802cacb
SM
11#include <type_traits>
12
508053d4
PP
13#include <babeltrace2/babeltrace.h>
14
15#include "common/assert.h"
7ece2fc0 16#include "cpp-common/bt2/clock-snapshot.hpp"
ccae279a 17#include "cpp-common/bt2/trace-ir.hpp"
c022776a 18#include "cpp-common/bt2s/optional.hpp"
c802cacb 19
0d218157 20#include "borrowed-object.hpp"
c802cacb 21#include "internal/utils.hpp"
7f5cdaf0 22#include "shared-object.hpp"
508053d4
PP
23
24namespace bt2 {
508053d4
PP
25namespace internal {
26
27struct MessageRefFuncs final
28{
c677c492 29 static void get(const bt_message * const libObjPtr) noexcept
508053d4
PP
30 {
31 bt_message_get_ref(libObjPtr);
32 }
33
c677c492 34 static void put(const bt_message * const libObjPtr) noexcept
508053d4
PP
35 {
36 bt_message_put_ref(libObjPtr);
37 }
38};
39
b5f55e9f 40} /* namespace internal */
508053d4 41
26b9d24c 42template <typename ObjT, typename LibObjT>
7f5cdaf0 43using SharedMessage = SharedObject<ObjT, LibObjT, internal::MessageRefFuncs>;
26b9d24c 44
508053d4
PP
45template <typename LibObjT>
46class CommonStreamBeginningMessage;
47
48template <typename LibObjT>
49class CommonStreamEndMessage;
50
51template <typename LibObjT>
52class CommonEventMessage;
53
54template <typename LibObjT>
55class CommonPacketBeginningMessage;
56
57template <typename LibObjT>
58class CommonPacketEndMessage;
59
60template <typename LibObjT>
61class CommonDiscardedEventsMessage;
62
63template <typename LibObjT>
64class CommonDiscardedPacketsMessage;
65
66template <typename LibObjT>
67class CommonMessageIteratorInactivityMessage;
68
69enum class MessageType
70{
71 STREAM_BEGINNING = BT_MESSAGE_TYPE_STREAM_BEGINNING,
72 STREAM_END = BT_MESSAGE_TYPE_STREAM_END,
73 EVENT = BT_MESSAGE_TYPE_EVENT,
74 PACKET_BEGINNING = BT_MESSAGE_TYPE_PACKET_BEGINNING,
75 PACKET_END = BT_MESSAGE_TYPE_PACKET_END,
76 DISCARDED_EVENTS = BT_MESSAGE_TYPE_DISCARDED_EVENTS,
77 DISCARDED_PACKETS = BT_MESSAGE_TYPE_DISCARDED_PACKETS,
78 MESSAGE_ITERATOR_INACTIVITY = BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY,
79};
80
81template <typename LibObjT>
0d218157 82class CommonMessage : public BorrowedObject<LibObjT>
508053d4
PP
83{
84private:
0d218157 85 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
508053d4
PP
86
87protected:
0d218157 88 using typename BorrowedObject<LibObjT>::_LibObjPtr;
508053d4
PP
89 using _ThisCommonMessage = CommonMessage<LibObjT>;
90
91public:
26b9d24c 92 using Shared = SharedMessage<CommonMessage<LibObjT>, LibObjT>;
508053d4 93
0d218157 94 explicit CommonMessage(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
508053d4
PP
95 {
96 }
97
98 template <typename OtherLibObjT>
0d218157 99 CommonMessage(const CommonMessage<OtherLibObjT> val) noexcept : _ThisBorrowedObject {val}
508053d4
PP
100 {
101 }
102
103 template <typename OtherLibObjT>
ac30a470 104 _ThisCommonMessage operator=(const CommonMessage<OtherLibObjT> val) noexcept
508053d4 105 {
0d218157 106 _ThisBorrowedObject::operator=(val);
508053d4
PP
107 return *this;
108 }
109
328a274a
PP
110 CommonMessage<const bt_message> asConst() const noexcept
111 {
112 return CommonMessage<const bt_message> {*this};
113 }
114
508053d4
PP
115 MessageType type() const noexcept
116 {
341a67c4 117 return static_cast<MessageType>(bt_message_get_type(this->libObjPtr()));
508053d4
PP
118 }
119
120 bool isStreamBeginning() const noexcept
121 {
122 return this->type() == MessageType::STREAM_BEGINNING;
123 }
124
125 bool isStreamEnd() const noexcept
126 {
127 return this->type() == MessageType::STREAM_END;
128 }
129
130 bool isEvent() const noexcept
131 {
132 return this->type() == MessageType::EVENT;
133 }
134
135 bool isPacketBeginning() const noexcept
136 {
137 return this->type() == MessageType::PACKET_BEGINNING;
138 }
139
140 bool isPacketEnd() const noexcept
141 {
142 return this->type() == MessageType::PACKET_END;
143 }
144
145 bool isDiscardedEvents() const noexcept
146 {
147 return this->type() == MessageType::DISCARDED_EVENTS;
148 }
149
150 bool isDiscardedPackets() const noexcept
151 {
152 return this->type() == MessageType::DISCARDED_PACKETS;
153 }
154
155 bool isMessageIteratorInactivity() const noexcept
156 {
157 return this->type() == MessageType::MESSAGE_ITERATOR_INACTIVITY;
158 }
159
160 Shared shared() const noexcept
161 {
c9c0b6e2 162 return Shared::createWithRef(*this);
508053d4
PP
163 }
164
45e0ded5
PP
165 template <typename MessageT>
166 MessageT as() const noexcept
167 {
168 return MessageT {this->libObjPtr()};
169 }
170
508053d4
PP
171 CommonStreamBeginningMessage<LibObjT> asStreamBeginning() const noexcept;
172 CommonStreamEndMessage<LibObjT> asStreamEnd() const noexcept;
173 CommonEventMessage<LibObjT> asEvent() const noexcept;
174 CommonPacketBeginningMessage<LibObjT> asPacketBeginning() const noexcept;
175 CommonPacketEndMessage<LibObjT> asPacketEnd() const noexcept;
176 CommonDiscardedEventsMessage<LibObjT> asDiscardedEvents() const noexcept;
177 CommonDiscardedPacketsMessage<LibObjT> asDiscardedPackets() const noexcept;
178 CommonMessageIteratorInactivityMessage<LibObjT> asMessageIteratorInactivity() const noexcept;
179};
180
181using Message = CommonMessage<bt_message>;
182using ConstMessage = CommonMessage<const bt_message>;
183
184namespace internal {
185
4927bae7
PP
186struct MessageTypeDescr
187{
188 using Const = ConstMessage;
189 using NonConst = Message;
190};
191
192template <>
193struct TypeDescr<Message> : public MessageTypeDescr
194{
195};
196
197template <>
198struct TypeDescr<ConstMessage> : public MessageTypeDescr
199{
200};
201
508053d4
PP
202template <typename LibObjT>
203struct CommonStreamBeginningMessageSpec;
204
b5f55e9f 205/* Functions specific to mutable stream beginning messages */
508053d4
PP
206template <>
207struct CommonStreamBeginningMessageSpec<bt_message> final
208{
209 static bt_stream *stream(bt_message * const libObjPtr) noexcept
210 {
211 return bt_message_stream_beginning_borrow_stream(libObjPtr);
212 }
213};
214
b5f55e9f 215/* Functions specific to constant stream beginning messages */
508053d4
PP
216template <>
217struct CommonStreamBeginningMessageSpec<const bt_message> final
218{
219 static const bt_stream *stream(const bt_message * const libObjPtr) noexcept
220 {
221 return bt_message_stream_beginning_borrow_stream_const(libObjPtr);
222 }
223};
224
b5f55e9f 225} /* namespace internal */
508053d4
PP
226
227template <typename LibObjT>
228class CommonStreamBeginningMessage final : public CommonMessage<LibObjT>
229{
230private:
231 using typename CommonMessage<LibObjT>::_LibObjPtr;
232 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
8047a175 233 using _Stream = internal::DepStream<LibObjT>;
508053d4
PP
234
235public:
26b9d24c 236 using Shared = SharedMessage<CommonStreamBeginningMessage<LibObjT>, LibObjT>;
508053d4
PP
237
238 explicit CommonStreamBeginningMessage(const _LibObjPtr libObjPtr) noexcept :
239 _ThisCommonMessage {libObjPtr}
240 {
241 BT_ASSERT_DBG(this->isStreamBeginning());
242 }
243
244 template <typename OtherLibObjT>
100fa861 245 CommonStreamBeginningMessage(const CommonStreamBeginningMessage<OtherLibObjT> val) noexcept :
508053d4
PP
246 _ThisCommonMessage {val}
247 {
248 }
249
250 template <typename OtherLibObjT>
ac30a470 251 CommonStreamBeginningMessage<LibObjT>
100fa861 252 operator=(const CommonStreamBeginningMessage<OtherLibObjT> val) noexcept
508053d4
PP
253 {
254 _ThisCommonMessage::operator=(val);
255 return *this;
256 }
257
328a274a
PP
258 CommonStreamBeginningMessage<const bt_message> asConst() const noexcept
259 {
260 return CommonStreamBeginningMessage<const bt_message> {*this};
261 }
262
dcb8ae9b 263 _Stream stream() const noexcept
508053d4
PP
264 {
265 return _Stream {
341a67c4 266 internal::CommonStreamBeginningMessageSpec<LibObjT>::stream(this->libObjPtr())};
508053d4
PP
267 }
268
dcb8ae9b 269 void defaultClockSnapshot(const std::uint64_t val) const noexcept
508053d4 270 {
5c895f64
PP
271 static_assert(!std::is_const<LibObjT>::value,
272 "Not available with `bt2::ConstStreamBeginningMessage`.");
508053d4 273
341a67c4 274 bt_message_stream_beginning_set_default_clock_snapshot(this->libObjPtr(), val);
508053d4
PP
275 }
276
c022776a 277 bt2s::optional<ConstClockSnapshot> defaultClockSnapshot() const noexcept
508053d4
PP
278 {
279 const bt_clock_snapshot *libObjPtr;
280 const auto state = bt_message_stream_beginning_borrow_default_clock_snapshot_const(
341a67c4 281 this->libObjPtr(), &libObjPtr);
508053d4
PP
282
283 if (state == BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN) {
284 return ConstClockSnapshot {libObjPtr};
285 }
286
c022776a 287 return bt2s::nullopt;
508053d4
PP
288 }
289
290 Shared shared() const noexcept
291 {
c9c0b6e2 292 return Shared::createWithRef(*this);
508053d4
PP
293 }
294};
295
296using StreamBeginningMessage = CommonStreamBeginningMessage<bt_message>;
297using ConstStreamBeginningMessage = CommonStreamBeginningMessage<const bt_message>;
298
299namespace internal {
300
4927bae7
PP
301struct StreamBeginningMessageTypeDescr
302{
303 using Const = ConstStreamBeginningMessage;
304 using NonConst = StreamBeginningMessage;
305};
306
307template <>
308struct TypeDescr<StreamBeginningMessage> : public StreamBeginningMessageTypeDescr
309{
310};
311
312template <>
313struct TypeDescr<ConstStreamBeginningMessage> : public StreamBeginningMessageTypeDescr
314{
315};
316
508053d4
PP
317template <typename LibObjT>
318struct CommonStreamEndMessageSpec;
319
b5f55e9f 320/* Functions specific to mutable stream end messages */
508053d4
PP
321template <>
322struct CommonStreamEndMessageSpec<bt_message> final
323{
324 static bt_stream *stream(bt_message * const libObjPtr) noexcept
325 {
326 return bt_message_stream_end_borrow_stream(libObjPtr);
327 }
328};
329
b5f55e9f 330/* Functions specific to constant stream end messages */
508053d4
PP
331template <>
332struct CommonStreamEndMessageSpec<const bt_message> final
333{
334 static const bt_stream *stream(const bt_message * const libObjPtr) noexcept
335 {
336 return bt_message_stream_end_borrow_stream_const(libObjPtr);
337 }
338};
339
b5f55e9f 340} /* namespace internal */
508053d4
PP
341
342template <typename LibObjT>
343class CommonStreamEndMessage final : public CommonMessage<LibObjT>
344{
345private:
346 using typename CommonMessage<LibObjT>::_LibObjPtr;
347 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
8047a175 348 using _Stream = internal::DepStream<LibObjT>;
508053d4
PP
349
350public:
26b9d24c 351 using Shared = SharedMessage<CommonStreamEndMessage<LibObjT>, LibObjT>;
508053d4
PP
352
353 explicit CommonStreamEndMessage(const _LibObjPtr libObjPtr) noexcept :
354 _ThisCommonMessage {libObjPtr}
355 {
356 BT_ASSERT_DBG(this->isStreamEnd());
357 }
358
359 template <typename OtherLibObjT>
100fa861 360 CommonStreamEndMessage(const CommonStreamEndMessage<OtherLibObjT> val) noexcept :
508053d4
PP
361 _ThisCommonMessage {val}
362 {
363 }
364
365 template <typename OtherLibObjT>
ac30a470 366 CommonStreamEndMessage<LibObjT>
100fa861 367 operator=(const CommonStreamEndMessage<OtherLibObjT> val) noexcept
508053d4
PP
368 {
369 _ThisCommonMessage::operator=(val);
370 return *this;
371 }
372
328a274a
PP
373 CommonStreamEndMessage<const bt_message> asConst() const noexcept
374 {
375 return CommonStreamEndMessage<const bt_message> {*this};
376 }
377
dcb8ae9b 378 _Stream stream() const noexcept
508053d4 379 {
341a67c4 380 return _Stream {internal::CommonStreamEndMessageSpec<LibObjT>::stream(this->libObjPtr())};
508053d4
PP
381 }
382
dcb8ae9b 383 void defaultClockSnapshot(const std::uint64_t val) const noexcept
508053d4 384 {
5c895f64
PP
385 static_assert(!std::is_const<LibObjT>::value,
386 "Not available with `bt2::ConstStreamEndMessage`.");
508053d4 387
341a67c4 388 bt_message_stream_end_set_default_clock_snapshot(this->libObjPtr(), val);
508053d4
PP
389 }
390
c022776a 391 bt2s::optional<ConstClockSnapshot> defaultClockSnapshot() const noexcept
508053d4
PP
392 {
393 const bt_clock_snapshot *libObjPtr;
394 const auto state = bt_message_stream_end_borrow_default_clock_snapshot_const(
341a67c4 395 this->libObjPtr(), &libObjPtr);
508053d4
PP
396
397 if (state == BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN) {
398 return ConstClockSnapshot {libObjPtr};
399 }
400
c022776a 401 return bt2s::nullopt;
508053d4
PP
402 }
403
404 Shared shared() const noexcept
405 {
c9c0b6e2 406 return Shared::createWithRef(*this);
508053d4
PP
407 }
408};
409
410using StreamEndMessage = CommonStreamEndMessage<bt_message>;
411using ConstStreamEndMessage = CommonStreamEndMessage<const bt_message>;
412
413namespace internal {
414
4927bae7
PP
415struct StreamEndMessageTypeDescr
416{
417 using Const = ConstStreamEndMessage;
418 using NonConst = StreamEndMessage;
419};
420
421template <>
422struct TypeDescr<StreamEndMessage> : public StreamEndMessageTypeDescr
423{
424};
425
426template <>
427struct TypeDescr<ConstStreamEndMessage> : public StreamEndMessageTypeDescr
428{
429};
430
508053d4
PP
431template <typename LibObjT>
432struct CommonPacketBeginningMessageSpec;
433
b5f55e9f 434/* Functions specific to mutable packet beginning messages */
508053d4
PP
435template <>
436struct CommonPacketBeginningMessageSpec<bt_message> final
437{
438 static bt_packet *packet(bt_message * const libObjPtr) noexcept
439 {
440 return bt_message_packet_beginning_borrow_packet(libObjPtr);
441 }
442};
443
b5f55e9f 444/* Functions specific to constant packet beginning messages */
508053d4
PP
445template <>
446struct CommonPacketBeginningMessageSpec<const bt_message> final
447{
448 static const bt_packet *packet(const bt_message * const libObjPtr) noexcept
449 {
450 return bt_message_packet_beginning_borrow_packet_const(libObjPtr);
451 }
452};
453
b5f55e9f 454} /* namespace internal */
508053d4
PP
455
456template <typename LibObjT>
457class CommonPacketBeginningMessage final : public CommonMessage<LibObjT>
458{
459private:
460 using typename CommonMessage<LibObjT>::_LibObjPtr;
461 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
8047a175 462 using _Packet = internal::DepPacket<LibObjT>;
508053d4
PP
463
464public:
26b9d24c 465 using Shared = SharedMessage<CommonPacketBeginningMessage<LibObjT>, LibObjT>;
508053d4
PP
466
467 explicit CommonPacketBeginningMessage(const _LibObjPtr libObjPtr) noexcept :
468 _ThisCommonMessage {libObjPtr}
469 {
470 BT_ASSERT_DBG(this->isPacketBeginning());
471 }
472
473 template <typename OtherLibObjT>
100fa861 474 CommonPacketBeginningMessage(const CommonPacketBeginningMessage<OtherLibObjT> val) noexcept :
508053d4
PP
475 _ThisCommonMessage {val}
476 {
477 }
478
479 template <typename OtherLibObjT>
ac30a470 480 CommonPacketBeginningMessage<LibObjT>
100fa861 481 operator=(const CommonPacketBeginningMessage<OtherLibObjT> val) noexcept
508053d4
PP
482 {
483 _ThisCommonMessage::operator=(val);
484 return *this;
485 }
486
328a274a
PP
487 CommonPacketBeginningMessage<const bt_message> asConst() const noexcept
488 {
489 return CommonPacketBeginningMessage<const bt_message> {*this};
490 }
491
dcb8ae9b 492 _Packet packet() const noexcept
508053d4
PP
493 {
494 return _Packet {
341a67c4 495 internal::CommonPacketBeginningMessageSpec<LibObjT>::packet(this->libObjPtr())};
508053d4
PP
496 }
497
dcb8ae9b 498 void defaultClockSnapshot(const std::uint64_t val) const noexcept
508053d4 499 {
5c895f64
PP
500 static_assert(!std::is_const<LibObjT>::value,
501 "Not available with `bt2::ConstPacketBeginningMessage`.");
508053d4 502
341a67c4 503 bt_message_packet_beginning_set_default_clock_snapshot(this->libObjPtr(), val);
508053d4
PP
504 }
505
506 ConstClockSnapshot defaultClockSnapshot() const noexcept
507 {
508 const auto libObjPtr =
341a67c4 509 bt_message_packet_beginning_borrow_default_clock_snapshot_const(this->libObjPtr());
508053d4
PP
510
511 return ConstClockSnapshot {libObjPtr};
512 }
513
514 Shared shared() const noexcept
515 {
c9c0b6e2 516 return Shared::createWithRef(*this);
508053d4
PP
517 }
518};
519
520using PacketBeginningMessage = CommonPacketBeginningMessage<bt_message>;
521using ConstPacketBeginningMessage = CommonPacketBeginningMessage<const bt_message>;
522
523namespace internal {
524
4927bae7
PP
525struct PacketBeginningMessageTypeDescr
526{
527 using Const = ConstPacketBeginningMessage;
528 using NonConst = PacketBeginningMessage;
529};
530
531template <>
532struct TypeDescr<PacketBeginningMessage> : public PacketBeginningMessageTypeDescr
533{
534};
535
536template <>
537struct TypeDescr<ConstPacketBeginningMessage> : public PacketBeginningMessageTypeDescr
538{
539};
540
508053d4
PP
541template <typename LibObjT>
542struct CommonPacketEndMessageSpec;
543
b5f55e9f 544/* Functions specific to mutable packet end messages */
508053d4
PP
545template <>
546struct CommonPacketEndMessageSpec<bt_message> final
547{
548 static bt_packet *packet(bt_message * const libObjPtr) noexcept
549 {
550 return bt_message_packet_end_borrow_packet(libObjPtr);
551 }
552};
553
b5f55e9f 554/* Functions specific to constant packet end messages */
508053d4
PP
555template <>
556struct CommonPacketEndMessageSpec<const bt_message> final
557{
558 static const bt_packet *packet(const bt_message * const libObjPtr) noexcept
559 {
560 return bt_message_packet_end_borrow_packet_const(libObjPtr);
561 }
562};
563
b5f55e9f 564} /* namespace internal */
508053d4
PP
565
566template <typename LibObjT>
567class CommonPacketEndMessage final : public CommonMessage<LibObjT>
568{
569private:
570 using typename CommonMessage<LibObjT>::_LibObjPtr;
571 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
8047a175 572 using _Packet = internal::DepPacket<LibObjT>;
508053d4
PP
573
574public:
26b9d24c 575 using Shared = SharedMessage<CommonPacketEndMessage<LibObjT>, LibObjT>;
508053d4
PP
576
577 explicit CommonPacketEndMessage(const _LibObjPtr libObjPtr) noexcept :
578 _ThisCommonMessage {libObjPtr}
579 {
580 BT_ASSERT_DBG(this->isPacketEnd());
581 }
582
583 template <typename OtherLibObjT>
100fa861 584 CommonPacketEndMessage(const CommonPacketEndMessage<OtherLibObjT> val) noexcept :
508053d4
PP
585 _ThisCommonMessage {val}
586 {
587 }
588
589 template <typename OtherLibObjT>
ac30a470 590 CommonPacketEndMessage<LibObjT>
100fa861 591 operator=(const CommonPacketEndMessage<OtherLibObjT> val) noexcept
508053d4
PP
592 {
593 _ThisCommonMessage::operator=(val);
594 return *this;
595 }
596
328a274a
PP
597 CommonPacketEndMessage<const bt_message> asConst() const noexcept
598 {
599 return CommonPacketEndMessage<const bt_message> {*this};
600 }
601
dcb8ae9b 602 _Packet packet() const noexcept
508053d4 603 {
341a67c4 604 return _Packet {internal::CommonPacketEndMessageSpec<LibObjT>::packet(this->libObjPtr())};
508053d4
PP
605 }
606
dcb8ae9b 607 void defaultClockSnapshot(const std::uint64_t val) const noexcept
508053d4 608 {
5c895f64
PP
609 static_assert(!std::is_const<LibObjT>::value,
610 "Not available with `bt2::ConstPacketEndMessage`.");
508053d4 611
341a67c4 612 bt_message_packet_end_set_default_clock_snapshot(this->libObjPtr(), val);
508053d4
PP
613 }
614
615 ConstClockSnapshot defaultClockSnapshot() const noexcept
616 {
617 const auto libObjPtr =
341a67c4 618 bt_message_packet_end_borrow_default_clock_snapshot_const(this->libObjPtr());
508053d4
PP
619
620 return ConstClockSnapshot {libObjPtr};
621 }
622
623 Shared shared() const noexcept
624 {
c9c0b6e2 625 return Shared::createWithRef(*this);
508053d4
PP
626 }
627};
628
629using PacketEndMessage = CommonPacketEndMessage<bt_message>;
630using ConstPacketEndMessage = CommonPacketEndMessage<const bt_message>;
631
632namespace internal {
633
4927bae7
PP
634struct PacketEndMessageTypeDescr
635{
636 using Const = ConstPacketEndMessage;
637 using NonConst = PacketEndMessage;
638};
639
640template <>
641struct TypeDescr<PacketEndMessage> : public PacketEndMessageTypeDescr
642{
643};
644
645template <>
646struct TypeDescr<ConstPacketEndMessage> : public PacketEndMessageTypeDescr
647{
648};
649
508053d4
PP
650template <typename LibObjT>
651struct CommonEventMessageSpec;
652
b5f55e9f 653/* Functions specific to mutable event messages */
508053d4
PP
654template <>
655struct CommonEventMessageSpec<bt_message> final
656{
657 static bt_event *event(bt_message * const libObjPtr) noexcept
658 {
659 return bt_message_event_borrow_event(libObjPtr);
660 }
661};
662
b5f55e9f 663/* Functions specific to constant event messages */
508053d4
PP
664template <>
665struct CommonEventMessageSpec<const bt_message> final
666{
667 static const bt_event *event(const bt_message * const libObjPtr) noexcept
668 {
669 return bt_message_event_borrow_event_const(libObjPtr);
670 }
671};
672
b5f55e9f 673} /* namespace internal */
508053d4
PP
674
675template <typename LibObjT>
676class CommonEventMessage final : public CommonMessage<LibObjT>
677{
678private:
679 using typename CommonMessage<LibObjT>::_LibObjPtr;
680 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
8047a175 681 using _Event = internal::DepType<LibObjT, CommonEvent<bt_event>, CommonEvent<const bt_event>>;
508053d4
PP
682
683public:
26b9d24c 684 using Shared = SharedMessage<CommonEventMessage<LibObjT>, LibObjT>;
508053d4
PP
685
686 explicit CommonEventMessage(const _LibObjPtr libObjPtr) noexcept :
687 _ThisCommonMessage {libObjPtr}
688 {
689 BT_ASSERT_DBG(this->isEvent());
690 }
691
692 template <typename OtherLibObjT>
100fa861 693 CommonEventMessage(const CommonEventMessage<OtherLibObjT> val) noexcept :
508053d4
PP
694 _ThisCommonMessage {val}
695 {
696 }
697
698 template <typename OtherLibObjT>
ac30a470 699 CommonEventMessage<LibObjT> operator=(const CommonEventMessage<OtherLibObjT> val) noexcept
508053d4
PP
700 {
701 _ThisCommonMessage::operator=(val);
702 return *this;
703 }
704
328a274a
PP
705 CommonEventMessage<const bt_message> asConst() const noexcept
706 {
707 return CommonEventMessage<const bt_message> {*this};
708 }
709
dcb8ae9b 710 _Event event() const noexcept
508053d4 711 {
341a67c4 712 return _Event {internal::CommonEventMessageSpec<LibObjT>::event(this->libObjPtr())};
508053d4
PP
713 }
714
84cef782
PP
715 bt2s::optional<ConstClockClass> streamClassDefaultClockClass() const noexcept
716 {
717 if (const auto libClkClsPtr =
718 bt_message_event_borrow_stream_class_default_clock_class_const(this->libObjPtr())) {
719 return ConstClockClass {libClkClsPtr};
720 }
721
722 return bt2s::nullopt;
723 }
724
508053d4
PP
725 ConstClockSnapshot defaultClockSnapshot() const noexcept
726 {
727 const auto libObjPtr =
341a67c4 728 bt_message_event_borrow_default_clock_snapshot_const(this->libObjPtr());
508053d4
PP
729
730 return ConstClockSnapshot {libObjPtr};
731 }
732
733 Shared shared() const noexcept
734 {
c9c0b6e2 735 return Shared::createWithRef(*this);
508053d4
PP
736 }
737};
738
739using EventMessage = CommonEventMessage<bt_message>;
740using ConstEventMessage = CommonEventMessage<const bt_message>;
741
742namespace internal {
743
4927bae7
PP
744struct EventMessageTypeDescr
745{
746 using Const = ConstEventMessage;
747 using NonConst = EventMessage;
748};
749
750template <>
751struct TypeDescr<EventMessage> : public EventMessageTypeDescr
752{
753};
754
755template <>
756struct TypeDescr<ConstEventMessage> : public EventMessageTypeDescr
757{
758};
759
508053d4
PP
760template <typename LibObjT>
761struct CommonDiscardedEventsMessageSpec;
762
b5f55e9f 763/* Functions specific to mutable discarded events messages */
508053d4
PP
764template <>
765struct CommonDiscardedEventsMessageSpec<bt_message> final
766{
767 static bt_stream *stream(bt_message * const libObjPtr) noexcept
768 {
769 return bt_message_discarded_events_borrow_stream(libObjPtr);
770 }
771};
772
b5f55e9f 773/* Functions specific to constant discarded events messages */
508053d4
PP
774template <>
775struct CommonDiscardedEventsMessageSpec<const bt_message> final
776{
777 static const bt_stream *stream(const bt_message * const libObjPtr) noexcept
778 {
779 return bt_message_discarded_events_borrow_stream_const(libObjPtr);
780 }
781};
782
b5f55e9f 783} /* namespace internal */
508053d4
PP
784
785template <typename LibObjT>
786class CommonDiscardedEventsMessage final : public CommonMessage<LibObjT>
787{
788private:
789 using typename CommonMessage<LibObjT>::_LibObjPtr;
790 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
8047a175 791 using _Stream = internal::DepStream<LibObjT>;
508053d4
PP
792
793public:
26b9d24c 794 using Shared = SharedMessage<CommonDiscardedEventsMessage<LibObjT>, LibObjT>;
508053d4
PP
795
796 explicit CommonDiscardedEventsMessage(const _LibObjPtr libObjPtr) noexcept :
797 _ThisCommonMessage {libObjPtr}
798 {
799 BT_ASSERT_DBG(this->isDiscardedEvents());
800 }
801
802 template <typename OtherLibObjT>
100fa861 803 CommonDiscardedEventsMessage(const CommonDiscardedEventsMessage<OtherLibObjT> val) noexcept :
508053d4
PP
804 _ThisCommonMessage {val}
805 {
806 }
807
808 template <typename OtherLibObjT>
ac30a470 809 CommonDiscardedEventsMessage<LibObjT>
100fa861 810 operator=(const CommonDiscardedEventsMessage<OtherLibObjT> val) noexcept
508053d4
PP
811 {
812 _ThisCommonMessage::operator=(val);
813 return *this;
814 }
815
328a274a
PP
816 CommonDiscardedEventsMessage<const bt_message> asConst() const noexcept
817 {
818 return CommonDiscardedEventsMessage<const bt_message> {*this};
819 }
820
dcb8ae9b 821 _Stream stream() const noexcept
508053d4
PP
822 {
823 return _Stream {
341a67c4 824 internal::CommonDiscardedEventsMessageSpec<LibObjT>::stream(this->libObjPtr())};
508053d4
PP
825 }
826
827 ConstClockSnapshot beginningDefaultClockSnapshot() const noexcept
828 {
829 const auto libObjPtr =
830 bt_message_discarded_events_borrow_beginning_default_clock_snapshot_const(
341a67c4 831 this->libObjPtr());
508053d4
PP
832
833 return ConstClockSnapshot {libObjPtr};
834 }
835
836 ConstClockSnapshot endDefaultClockSnapshot() const noexcept
837 {
838 const auto libObjPtr =
341a67c4 839 bt_message_discarded_events_borrow_end_default_clock_snapshot_const(this->libObjPtr());
508053d4
PP
840
841 return ConstClockSnapshot {libObjPtr};
842 }
843
dcb8ae9b 844 void count(const std::uint64_t count) const noexcept
508053d4 845 {
5c895f64
PP
846 static_assert(!std::is_const<LibObjT>::value,
847 "Not available with `bt2::ConstDiscardedEventsMessage`.");
508053d4 848
341a67c4 849 bt_message_discarded_events_set_count(this->libObjPtr(), count);
508053d4
PP
850 }
851
c022776a 852 bt2s::optional<std::uint64_t> count() const noexcept
508053d4
PP
853 {
854 std::uint64_t count;
341a67c4 855 const auto avail = bt_message_discarded_events_get_count(this->libObjPtr(), &count);
508053d4
PP
856
857 if (avail) {
858 return count;
859 }
860
c022776a 861 return bt2s::nullopt;
508053d4
PP
862 }
863
864 Shared shared() const noexcept
865 {
c9c0b6e2 866 return Shared::createWithRef(*this);
508053d4
PP
867 }
868};
869
870using DiscardedEventsMessage = CommonDiscardedEventsMessage<bt_message>;
871using ConstDiscardedEventsMessage = CommonDiscardedEventsMessage<const bt_message>;
872
873namespace internal {
874
4927bae7
PP
875struct DiscardedEventsMessageTypeDescr
876{
877 using Const = ConstDiscardedEventsMessage;
878 using NonConst = DiscardedEventsMessage;
879};
880
881template <>
882struct TypeDescr<DiscardedEventsMessage> : public DiscardedEventsMessageTypeDescr
883{
884};
885
886template <>
887struct TypeDescr<ConstDiscardedEventsMessage> : public DiscardedEventsMessageTypeDescr
888{
889};
890
508053d4
PP
891template <typename LibObjT>
892struct CommonDiscardedPacketsMessageSpec;
893
b5f55e9f 894/* Functions specific to mutable discarded packets messages */
508053d4
PP
895template <>
896struct CommonDiscardedPacketsMessageSpec<bt_message> final
897{
898 static bt_stream *stream(bt_message * const libObjPtr) noexcept
899 {
900 return bt_message_discarded_packets_borrow_stream(libObjPtr);
901 }
902};
903
b5f55e9f 904/* Functions specific to constant discarded packets messages */
508053d4
PP
905template <>
906struct CommonDiscardedPacketsMessageSpec<const bt_message> final
907{
908 static const bt_stream *stream(const bt_message * const libObjPtr) noexcept
909 {
910 return bt_message_discarded_packets_borrow_stream_const(libObjPtr);
911 }
912};
913
b5f55e9f 914} /* namespace internal */
508053d4
PP
915
916template <typename LibObjT>
917class CommonDiscardedPacketsMessage final : public CommonMessage<LibObjT>
918{
919private:
920 using typename CommonMessage<LibObjT>::_LibObjPtr;
921 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
8047a175 922 using _Stream = internal::DepStream<LibObjT>;
508053d4
PP
923
924public:
26b9d24c 925 using Shared = SharedMessage<CommonDiscardedPacketsMessage<LibObjT>, LibObjT>;
508053d4
PP
926
927 explicit CommonDiscardedPacketsMessage(const _LibObjPtr libObjPtr) noexcept :
928 _ThisCommonMessage {libObjPtr}
929 {
930 BT_ASSERT_DBG(this->isDiscardedPackets());
931 }
932
933 template <typename OtherLibObjT>
100fa861 934 CommonDiscardedPacketsMessage(const CommonDiscardedPacketsMessage<OtherLibObjT> val) noexcept :
508053d4
PP
935 _ThisCommonMessage {val}
936 {
937 }
938
939 template <typename OtherLibObjT>
ac30a470 940 CommonDiscardedPacketsMessage<LibObjT>
100fa861 941 operator=(const CommonDiscardedPacketsMessage<OtherLibObjT> val) noexcept
508053d4
PP
942 {
943 _ThisCommonMessage::operator=(val);
944 return *this;
945 }
946
328a274a
PP
947 CommonDiscardedPacketsMessage<const bt_message> asConst() const noexcept
948 {
949 return CommonDiscardedPacketsMessage<const bt_message> {*this};
950 }
951
dcb8ae9b 952 _Stream stream() const noexcept
508053d4
PP
953 {
954 return _Stream {
341a67c4 955 internal::CommonDiscardedPacketsMessageSpec<LibObjT>::stream(this->libObjPtr())};
508053d4
PP
956 }
957
958 ConstClockSnapshot beginningDefaultClockSnapshot() const noexcept
959 {
960 const auto libObjPtr =
961 bt_message_discarded_packets_borrow_beginning_default_clock_snapshot_const(
341a67c4 962 this->libObjPtr());
508053d4
PP
963
964 return ConstClockSnapshot {libObjPtr};
965 }
966
967 ConstClockSnapshot endDefaultClockSnapshot() const noexcept
968 {
341a67c4
FD
969 const auto libObjPtr =
970 bt_message_discarded_packets_borrow_end_default_clock_snapshot_const(this->libObjPtr());
508053d4
PP
971
972 return ConstClockSnapshot {libObjPtr};
973 }
974
dcb8ae9b 975 void count(const std::uint64_t count) const noexcept
508053d4 976 {
5c895f64
PP
977 static_assert(!std::is_const<LibObjT>::value,
978 "Not available with `bt2::ConstDiscardedPacketsMessage`.");
508053d4 979
341a67c4 980 bt_message_discarded_packets_set_count(this->libObjPtr(), count);
508053d4
PP
981 }
982
c022776a 983 bt2s::optional<std::uint64_t> count() const noexcept
508053d4
PP
984 {
985 std::uint64_t count;
341a67c4 986 const auto avail = bt_message_discarded_packets_get_count(this->libObjPtr(), &count);
508053d4
PP
987
988 if (avail) {
989 return count;
990 }
991
c022776a 992 return bt2s::nullopt;
508053d4
PP
993 }
994
995 Shared shared() const noexcept
996 {
c9c0b6e2 997 return Shared::createWithRef(*this);
508053d4
PP
998 }
999};
1000
1001using DiscardedPacketsMessage = CommonDiscardedPacketsMessage<bt_message>;
1002using ConstDiscardedPacketsMessage = CommonDiscardedPacketsMessage<const bt_message>;
1003
4927bae7
PP
1004namespace internal {
1005
1006struct DiscardedPacketsMessageTypeDescr
1007{
1008 using Const = ConstDiscardedPacketsMessage;
1009 using NonConst = DiscardedPacketsMessage;
1010};
1011
1012template <>
1013struct TypeDescr<DiscardedPacketsMessage> : public DiscardedPacketsMessageTypeDescr
1014{
1015};
1016
1017template <>
1018struct TypeDescr<ConstDiscardedPacketsMessage> : public DiscardedPacketsMessageTypeDescr
1019{
1020};
1021
1022} /* namespace internal */
1023
508053d4
PP
1024template <typename LibObjT>
1025class CommonMessageIteratorInactivityMessage final : public CommonMessage<LibObjT>
1026{
1027private:
1028 using typename CommonMessage<LibObjT>::_LibObjPtr;
1029 using typename CommonMessage<LibObjT>::_ThisCommonMessage;
1030
1031public:
26b9d24c 1032 using Shared = SharedMessage<CommonMessageIteratorInactivityMessage<LibObjT>, LibObjT>;
508053d4
PP
1033
1034 explicit CommonMessageIteratorInactivityMessage(const _LibObjPtr libObjPtr) noexcept :
1035 _ThisCommonMessage {libObjPtr}
1036 {
1037 BT_ASSERT_DBG(this->isMessageIteratorInactivity());
1038 }
1039
1040 template <typename OtherLibObjT>
1041 CommonMessageIteratorInactivityMessage(
100fa861 1042 const CommonMessageIteratorInactivityMessage<OtherLibObjT> val) noexcept :
508053d4
PP
1043 _ThisCommonMessage {val}
1044 {
1045 }
1046
1047 template <typename OtherLibObjT>
ac30a470 1048 CommonMessageIteratorInactivityMessage<LibObjT>
100fa861 1049 operator=(const CommonMessageIteratorInactivityMessage<OtherLibObjT> val) noexcept
508053d4
PP
1050 {
1051 _ThisCommonMessage::operator=(val);
1052 return *this;
1053 }
1054
328a274a
PP
1055 CommonMessageIteratorInactivityMessage<const bt_message> asConst() const noexcept
1056 {
1057 return CommonMessageIteratorInactivityMessage<const bt_message> {*this};
1058 }
1059
508053d4
PP
1060 ConstClockSnapshot clockSnapshot() const noexcept
1061 {
1062 const auto libObjPtr =
341a67c4 1063 bt_message_message_iterator_inactivity_borrow_clock_snapshot_const(this->libObjPtr());
508053d4
PP
1064
1065 return ConstClockSnapshot {libObjPtr};
1066 }
1067
1068 Shared shared() const noexcept
1069 {
c9c0b6e2 1070 return Shared::createWithRef(*this);
508053d4
PP
1071 }
1072};
1073
1074using MessageIteratorInactivityMessage = CommonMessageIteratorInactivityMessage<bt_message>;
1075using ConstMessageIteratorInactivityMessage =
1076 CommonMessageIteratorInactivityMessage<const bt_message>;
1077
4927bae7
PP
1078namespace internal {
1079
1080struct MessageIteratorInactivityMessageTypeDescr
1081{
1082 using Const = ConstMessageIteratorInactivityMessage;
1083 using NonConst = MessageIteratorInactivityMessage;
1084};
1085
1086template <>
1087struct TypeDescr<MessageIteratorInactivityMessage> :
1088 public MessageIteratorInactivityMessageTypeDescr
1089{
1090};
1091
1092template <>
1093struct TypeDescr<ConstMessageIteratorInactivityMessage> :
1094 public MessageIteratorInactivityMessageTypeDescr
1095{
1096};
1097
1098} /* namespace internal */
1099
508053d4
PP
1100template <typename LibObjT>
1101CommonStreamBeginningMessage<LibObjT> CommonMessage<LibObjT>::asStreamBeginning() const noexcept
1102{
1103 BT_ASSERT_DBG(this->isStreamBeginning());
341a67c4 1104 return CommonStreamBeginningMessage<LibObjT> {this->libObjPtr()};
508053d4
PP
1105}
1106
1107template <typename LibObjT>
1108CommonStreamEndMessage<LibObjT> CommonMessage<LibObjT>::asStreamEnd() const noexcept
1109{
1110 BT_ASSERT_DBG(this->isStreamEnd());
341a67c4 1111 return CommonStreamEndMessage<LibObjT> {this->libObjPtr()};
508053d4
PP
1112}
1113
1114template <typename LibObjT>
1115CommonPacketBeginningMessage<LibObjT> CommonMessage<LibObjT>::asPacketBeginning() const noexcept
1116{
1117 BT_ASSERT_DBG(this->isPacketBeginning());
341a67c4 1118 return CommonPacketBeginningMessage<LibObjT> {this->libObjPtr()};
508053d4
PP
1119}
1120
1121template <typename LibObjT>
1122CommonPacketEndMessage<LibObjT> CommonMessage<LibObjT>::asPacketEnd() const noexcept
1123{
1124 BT_ASSERT_DBG(this->isPacketEnd());
341a67c4 1125 return CommonPacketEndMessage<LibObjT> {this->libObjPtr()};
508053d4
PP
1126}
1127
1128template <typename LibObjT>
1129CommonEventMessage<LibObjT> CommonMessage<LibObjT>::asEvent() const noexcept
1130{
1131 BT_ASSERT_DBG(this->isEvent());
341a67c4 1132 return CommonEventMessage<LibObjT> {this->libObjPtr()};
508053d4
PP
1133}
1134
1135template <typename LibObjT>
1136CommonDiscardedEventsMessage<LibObjT> CommonMessage<LibObjT>::asDiscardedEvents() const noexcept
1137{
1138 BT_ASSERT_DBG(this->isDiscardedEvents());
341a67c4 1139 return CommonDiscardedEventsMessage<LibObjT> {this->libObjPtr()};
508053d4
PP
1140}
1141
bd7dbf87
FD
1142template <typename LibObjT>
1143CommonDiscardedPacketsMessage<LibObjT> CommonMessage<LibObjT>::asDiscardedPackets() const noexcept
1144{
1145 BT_ASSERT_DBG(this->isDiscardedPackets());
1146 return CommonDiscardedPacketsMessage<LibObjT> {this->libObjPtr()};
1147}
1148
508053d4
PP
1149template <typename LibObjT>
1150CommonMessageIteratorInactivityMessage<LibObjT>
1151CommonMessage<LibObjT>::asMessageIteratorInactivity() const noexcept
1152{
1153 BT_ASSERT_DBG(this->isMessageIteratorInactivity());
341a67c4 1154 return CommonMessageIteratorInactivityMessage<LibObjT> {this->libObjPtr()};
508053d4
PP
1155}
1156
b5f55e9f 1157} /* namespace bt2 */
508053d4 1158
b5f55e9f 1159#endif /* BABELTRACE_CPP_COMMON_BT2_MESSAGE_HPP */
This page took 0.082372 seconds and 4 git commands to generate.