2 * Copyright (c) 2023 Simon Marchi <simon.marchi@efficios.com>
3 * Copyright (c) 2023 Philippe Proulx <pproulx@efficios.com>
5 * SPDX-License-Identifier: MIT
8 #ifndef BABELTRACE_CPP_COMMON_BT2_PLUGIN_DEV_HPP
9 #define BABELTRACE_CPP_COMMON_BT2_PLUGIN_DEV_HPP
15 #include <babeltrace2/babeltrace.h>
17 #include "cpp-common/bt2c/c-string-view.hpp"
18 #include "cpp-common/bt2c/logging.hpp"
19 #include "cpp-common/vendor/fmt/core.h"
22 #include "internal/comp-cls-bridge.hpp" /* IWYU pragma: keep */
26 template <typename UserMessageIteratorT, typename UserComponentT>
27 class UserMessageIterator;
30 * Base class of any user component.
32 * See the specific `bt2::UserSourceComponent`,
33 * `bt2::UserFilterComponent`, and `bt2::UserSinkComponent`.
35 template <typename SelfCompT, typename InitDataT, typename QueryDataT>
38 /* Give a related message iterator access to this logger */
39 template <typename, typename>
40 friend class UserMessageIterator;
43 using InitData = InitDataT;
44 using QueryData = QueryDataT;
47 explicit UserComponent(const SelfCompT selfComp, const std::string& logTag) :
48 _mLogger {selfComp, fmt::format("{}/[{}]", logTag, selfComp.name())}, _mSelfComp {selfComp}
53 bt2c::CStringView _name() const noexcept
55 return _mSelfComp.name();
58 LoggingLevel _loggingLevel() const noexcept
60 return _mSelfComp.loggingLevel();
63 std::uint64_t _graphMipVersion() const noexcept
65 return _mSelfComp.graphMipVersion();
68 SelfCompT _selfComp() noexcept
73 bt2c::Logger _mLogger;
80 * Base class of a user source component `UserComponentT` (CRTP).
82 * UserComponentT::UserComponentT() must accept, in this order:
84 * 1. A `bt2::SelfSourceComponent` parameter, which it needs to forward
85 * to bt2::UserSourceComponent::UserSourceComponent().
87 * 2. A `bt2::ConstValue` parameter (the initialization parameters).
89 * 3. An `InitDataT *` parameter (the initialization method data).
91 * `UserMessageIteratorT`, the message iterator class to use, must inherit
92 * `UserMessageIterator`.
94 * UserComponentT::_query() receives a query method data pointer of type
95 * `QueryDataT *` as its last parameter.
97 template <typename UserComponentT, typename UserMessageIteratorT, typename InitDataT = void,
98 typename QueryDataT = void>
99 class UserSourceComponent : public UserComponent<SelfSourceComponent, InitDataT, QueryDataT>
101 static_assert(std::is_base_of<UserMessageIterator<UserMessageIteratorT, UserComponentT>,
102 UserMessageIteratorT>::value,
103 "`UserMessageIteratorT` inherits `UserMessageIterator`");
106 using MessageIterator = UserMessageIteratorT;
109 using _OutputPorts = SelfSourceComponent::OutputPorts;
111 explicit UserSourceComponent(const SelfSourceComponent selfComp, const std::string& logTag) :
112 UserComponent<SelfSourceComponent, InitDataT, QueryDataT> {selfComp, logTag}
117 static Value::Shared query(const SelfComponentClass selfCompCls,
118 const PrivateQueryExecutor privQueryExec,
119 const bt2c::CStringView obj, const ConstValue params,
120 QueryDataT * const data)
122 return UserComponentT::_query(selfCompCls, privQueryExec, obj, params, data);
125 static void getSupportedMipVersions(const SelfComponentClass selfCompCls,
126 const ConstValue params, const LoggingLevel loggingLevel,
127 const UnsignedIntegerRangeSet ranges)
129 UserComponentT::_getSupportedMipVersions(selfCompCls, params, loggingLevel, ranges);
132 void outputPortConnected(const SelfComponentOutputPort outputPort,
133 const ConstInputPort inputPort)
135 static_cast<UserComponentT&>(*this)._outputPortConnected(outputPort, inputPort);
140 static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
141 ConstValue, QueryDataT *)
143 throw UnknownObject {};
147 static void _getSupportedMipVersions(SelfComponentClass, ConstValue, LoggingLevel,
148 const UnsignedIntegerRangeSet ranges)
150 ranges.addRange(0, 0);
154 void _outputPortConnected(SelfComponentOutputPort, ConstInputPort)
158 template <typename DataT>
159 _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT& data)
161 return this->_selfComp().addOutputPort(name, data);
164 _OutputPorts::Port _addOutputPort(const bt2c::CStringView name)
166 return this->_selfComp().addOutputPort(name);
169 _OutputPorts _outputPorts() noexcept
171 return this->_selfComp().outputPorts();
176 * Base class of a user filter component `UserComponentT` (CRTP).
178 * UserComponentT::UserComponentT() must accept, in this order:
180 * 1. A `bt2::SelfFilterComponent` parameter, which it needs to forward
181 * to bt2::UserFilterComponent::UserFilterComponent().
183 * 2. A `bt2::ConstValue` parameter (the initialization parameters).
185 * 3. An `InitDataT *` parameter (the initialization method data).
187 * `UserMessageIteratorT`, the message iterator class to use, must inherit
188 * `UserMessageIterator`.
190 * UserComponentT::_query() receives a query method data pointer of type
191 * `QueryDataT *` as its last parameter.
193 template <typename UserComponentT, typename UserMessageIteratorT, typename InitDataT = void,
194 typename QueryDataT = void>
195 class UserFilterComponent : public UserComponent<SelfFilterComponent, InitDataT, QueryDataT>
197 static_assert(std::is_base_of<UserMessageIterator<UserMessageIteratorT, UserComponentT>,
198 UserMessageIteratorT>::value,
199 "`UserMessageIteratorT` inherits `UserMessageIterator`");
202 using MessageIterator = UserMessageIteratorT;
205 using _InputPorts = SelfFilterComponent::InputPorts;
206 using _OutputPorts = SelfFilterComponent::OutputPorts;
208 explicit UserFilterComponent(const SelfFilterComponent selfComp, const std::string& logTag) :
209 UserComponent<SelfFilterComponent, InitDataT, QueryDataT> {selfComp, logTag}
214 static Value::Shared query(const SelfComponentClass selfCompCls,
215 const PrivateQueryExecutor privQueryExec,
216 const bt2c::CStringView obj, const ConstValue params,
217 QueryDataT * const data)
219 return UserComponentT::_query(selfCompCls, privQueryExec, obj, params, data);
222 static void getSupportedMipVersions(const SelfComponentClass selfCompCls,
223 const ConstValue params, const LoggingLevel loggingLevel,
224 const UnsignedIntegerRangeSet ranges)
226 UserComponentT::_getSupportedMipVersions(selfCompCls, params, loggingLevel, ranges);
229 void inputPortConnected(const SelfComponentInputPort inputPort,
230 const ConstOutputPort outputPort)
232 static_cast<UserComponentT&>(*this)._inputPortConnected(inputPort, outputPort);
235 void outputPortConnected(const SelfComponentOutputPort outputPort,
236 const ConstInputPort inputPort)
238 static_cast<UserComponentT&>(*this)._outputPortConnected(outputPort, inputPort);
243 static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
244 ConstValue, QueryDataT *)
246 throw UnknownObject {};
250 static void _getSupportedMipVersions(SelfComponentClass, ConstValue, LoggingLevel,
251 const UnsignedIntegerRangeSet ranges)
253 ranges.addRange(0, 0);
257 void _inputPortConnected(SelfComponentInputPort, ConstOutputPort)
262 void _outputPortConnected(SelfComponentOutputPort, ConstInputPort)
266 template <typename DataT>
267 _OutputPorts::Port _addInputPort(const bt2c::CStringView name, DataT& data)
269 return this->_selfComp().addInputPort(name, data);
272 _InputPorts::Port _addInputPort(const bt2c::CStringView name)
274 return this->_selfComp().addInputPort(name);
277 _InputPorts _inputPorts() noexcept
279 return this->_selfComp().inputPorts();
282 template <typename DataT>
283 _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT& data)
285 return this->_selfComp().addOutputPort(name, data);
288 _OutputPorts::Port _addOutputPort(const bt2c::CStringView name)
290 return this->_selfComp().addOutputPort(name);
293 _OutputPorts _outputPorts() noexcept
295 return this->_selfComp().outputPorts();
300 * Base class of a user sink component `UserComponentT` (CRTP).
302 * UserComponentT::UserComponentT() must accept, in this order:
304 * 1. A `bt2::SelfSinkComponent` parameter, which it needs to forward
305 * to bt2::UserSinkComponent::UserSinkComponent().
307 * 2. A `bt2::ConstValue` parameter (the initialization parameters).
309 * 3. An `InitDataT *` parameter (the initialization method data).
311 * `UserComponentT` must implement:
315 * This method returns `true` if the sink component still needs to
316 * consume, or `false` if it's finished.
318 * UserComponentT::_query() receives a query method data pointer of type
319 * `QueryDataT *` as its last parameter.
322 template <typename UserComponentT, typename InitDataT = void, typename QueryDataT = void>
323 class UserSinkComponent : public UserComponent<SelfSinkComponent, InitDataT, QueryDataT>
326 using _InputPorts = SelfSinkComponent::InputPorts;
328 explicit UserSinkComponent(const SelfSinkComponent selfComp, const std::string& logTag) :
329 UserComponent<SelfSinkComponent, InitDataT, QueryDataT> {selfComp, logTag}
334 static Value::Shared query(const SelfComponentClass selfCompCls,
335 const PrivateQueryExecutor privQueryExec,
336 const bt2c::CStringView obj, const ConstValue params,
337 QueryDataT * const data)
339 return UserComponentT::_query(selfCompCls, privQueryExec, obj, params, data);
342 static void getSupportedMipVersions(const SelfComponentClass selfCompCls,
343 const ConstValue params, const LoggingLevel loggingLevel,
344 const UnsignedIntegerRangeSet ranges)
346 UserComponentT::_getSupportedMipVersions(selfCompCls, params, loggingLevel, ranges);
349 void graphIsConfigured()
351 static_cast<UserComponentT&>(*this)._graphIsConfigured();
354 void inputPortConnected(const SelfComponentInputPort inputPort,
355 const ConstOutputPort outputPort)
357 static_cast<UserComponentT&>(*this)._inputPortConnected(inputPort, outputPort);
362 return static_cast<UserComponentT&>(*this)._consume();
367 static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
368 ConstValue, QueryDataT *)
370 throw UnknownObject {};
374 static void _getSupportedMipVersions(SelfComponentClass, ConstValue, LoggingLevel,
375 const UnsignedIntegerRangeSet ranges)
377 ranges.addRange(0, 0);
381 void _graphIsConfigured()
386 void _inputPortConnected(SelfComponentInputPort, ConstOutputPort)
390 MessageIterator::Shared _createMessageIterator(const _InputPorts::Port port)
392 return this->_selfComp().createMessageIterator(port);
395 template <typename DataT>
396 _InputPorts::Port _addInputPort(const bt2c::CStringView name, DataT& data)
398 return this->_selfComp().addInputPort(name, data);
401 _InputPorts::Port _addInputPort(const bt2c::CStringView name)
403 return this->_selfComp().addInputPort(name);
406 _InputPorts _inputPorts() noexcept
408 return this->_selfComp().inputPorts();
413 * Base class of a user message iterator `UserMessageIteratorT` (CRTP)
414 * of which the parent user component class is `UserComponentT`.
416 * `UserMessageIteratorT::UserMessageIteratorT()` must accept a
417 * `bt2::SelfMessageIterator` parameter, which it needs to forward to
418 * bt2::UserMessageIterator::UserMessageIterator().
420 * The public next() method below (called by the bridge) implements the
421 * very common pattern of appending messages into the output array, and,
424 * If it catches a `bt2::TryAgain` exception:
425 * If the message array isn't empty, transform this into a success
430 * If it catches an error:
431 * If the message array isn't empty, transform this into a success
432 * (don't throw), but save the error of the current thread and the
433 * type of error to throw the next time the user calls next().
437 * `UserMessageIteratorT` must implement:
439 * void _next(bt2::ConstMessageArray& messages);
441 * This method fills `messages` with at most `messages.capacity()`
442 * messages and may throw `bt2::TryAgain` or a valid error whenever.
443 * Leaving an empty `messages` means the end of iteration.
445 template <typename UserMessageIteratorT, typename UserComponentT>
446 class UserMessageIterator
449 /* Type of `_mExcToThrowType` */
450 enum class _ExcToThrowType
458 explicit UserMessageIterator(const SelfMessageIterator selfMsgIter,
459 const std::string& logTagSuffix) :
460 _mSelfMsgIter {selfMsgIter},
461 _mLogger {selfMsgIter,
462 fmt::format("{}/{}", this->_component()._mLogger.tag(), logTagSuffix)}
467 ~UserMessageIterator()
472 void next(bt2::ConstMessageArray& messages)
474 /* Any saved error? Now is the time to throw */
475 if (G_UNLIKELY(_mExcToThrowType != _ExcToThrowType::NONE)) {
476 /* Move `_mSavedLibError`, if any, as current thread error */
477 if (_mSavedLibError) {
478 BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET(_mSavedLibError);
481 /* Throw the corresponding exception */
482 if (_mExcToThrowType == _ExcToThrowType::ERROR) {
485 BT_ASSERT(_mExcToThrowType == _ExcToThrowType::MEM_ERROR);
486 throw bt2::MemoryError {};
491 * When catching some exception below, if our message array
492 * isn't empty, then return immediately before throwing to
493 * provide those messages to downstream.
495 * When catching an error, also save the current thread error,
496 * if any, so that we can restore it later (see the beginning of
499 BT_ASSERT_DBG(_mExcToThrowType == _ExcToThrowType::NONE);
502 this->_userObj()._next(messages);
504 /* We're done: everything below is exception handling */
506 } catch (const bt2::TryAgain&) {
507 if (messages.isEmpty()) {
510 } catch (const std::bad_alloc&) {
511 if (messages.isEmpty()) {
515 _mExcToThrowType = _ExcToThrowType::MEM_ERROR;
516 } catch (const bt2::Error&) {
517 if (messages.isEmpty()) {
521 _mExcToThrowType = _ExcToThrowType::ERROR;
524 if (_mExcToThrowType != _ExcToThrowType::NONE) {
526 "An error occurred, but there are {} messages to return: delaying the error reporting.",
528 BT_ASSERT(!_mSavedLibError);
529 _mSavedLibError = bt_current_thread_take_error();
533 bool canSeekBeginning()
536 return this->_userObj()._canSeekBeginning();
542 return this->_userObj()._seekBeginning();
545 bool canSeekNsFromOrigin(const std::int64_t nsFromOrigin)
548 return this->_userObj()._canSeekNsFromOrigin(nsFromOrigin);
551 void seekNsFromOrigin(const std::int64_t nsFromOrigin)
554 this->_userObj()._seekNsFromOrigin(nsFromOrigin);
559 bool _canSeekBeginning() noexcept
565 void _seekBeginning() noexcept
570 bool _canSeekNsFromOrigin(std::int64_t) noexcept
576 void _seekNsFromOrigin(std::int64_t) noexcept
580 MessageIterator::Shared _createMessageIterator(const SelfComponentInputPort port)
582 return _mSelfMsgIter.createMessageIterator(port);
585 UserComponentT& _component() noexcept
587 return _mSelfMsgIter.component().template data<UserComponentT>();
590 SelfComponentOutputPort _port() noexcept
592 return _mSelfMsgIter.port();
595 bool _isInterrupted() const noexcept
597 return _mSelfMsgIter.isInterrupted();
601 UserMessageIteratorT& _userObj() noexcept
603 return static_cast<UserMessageIteratorT&>(*this);
606 void _resetError() noexcept
608 _mExcToThrowType = _ExcToThrowType::NONE;
610 if (_mSavedLibError) {
611 bt_error_release(_mSavedLibError);
615 SelfMessageIterator _mSelfMsgIter;
618 * next() may accumulate messages, and then catch an error before
619 * returning. In that case, it saves the error of the current thread
620 * here so that it can return its accumulated messages and throw the
623 * It also saves the type of the exception to throw the next time.
625 _ExcToThrowType _mExcToThrowType = _ExcToThrowType::NONE;
626 const bt_error *_mSavedLibError = nullptr;
629 bt2c::Logger _mLogger;
632 } /* namespace bt2 */
634 #define BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(_pluginId, _componentClassId, _name, \
635 _userComponentClass) \
636 BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID( \
637 _pluginId, _componentClassId, _name, \
638 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::next); \
639 BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID( \
640 _pluginId, _componentClassId, bt2::internal::SrcCompClsBridge<_userComponentClass>::init); \
641 BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID( \
642 _pluginId, _componentClassId, \
643 bt2::internal::SrcCompClsBridge<_userComponentClass>::finalize); \
644 BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID( \
645 _pluginId, _componentClassId, \
646 bt2::internal::SrcCompClsBridge<_userComponentClass>::getSupportedMipVersions); \
647 BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID( \
648 _pluginId, _componentClassId, \
649 bt2::internal::SrcCompClsBridge<_userComponentClass>::outputPortConnected); \
650 BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD_WITH_ID( \
651 _pluginId, _componentClassId, \
652 bt2::internal::SrcCompClsBridge<_userComponentClass>::query); \
653 BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID( \
654 _pluginId, _componentClassId, \
655 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::init); \
656 BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID( \
657 _pluginId, _componentClassId, \
658 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::finalize); \
659 BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID( \
660 _pluginId, _componentClassId, \
661 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekBeginning, \
662 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::canSeekBeginning); \
663 BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID( \
664 _pluginId, _componentClassId, \
665 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekNsFromOrigin, \
666 bt2::internal::MsgIterClsBridge< \
667 _userComponentClass::MessageIterator>::canSeekNsFromOrigin);
669 #define BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(_pluginId, _componentClassId, _name, \
670 _userComponentClass) \
671 BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID( \
672 _pluginId, _componentClassId, _name, \
673 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::next); \
674 BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID( \
675 _pluginId, _componentClassId, bt2::internal::FltCompClsBridge<_userComponentClass>::init); \
676 BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID( \
677 _pluginId, _componentClassId, \
678 bt2::internal::FltCompClsBridge<_userComponentClass>::finalize); \
679 BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID( \
680 _pluginId, _componentClassId, \
681 bt2::internal::FltCompClsBridge<_userComponentClass>::getSupportedMipVersions); \
682 BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID( \
683 _pluginId, _componentClassId, \
684 bt2::internal::FltCompClsBridge<_userComponentClass>::inputPortConnected); \
685 BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID( \
686 _pluginId, _componentClassId, \
687 bt2::internal::FltCompClsBridge<_userComponentClass>::outputPortConnected); \
688 BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD_WITH_ID( \
689 _pluginId, _componentClassId, \
690 bt2::internal::FltCompClsBridge<_userComponentClass>::query); \
691 BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID( \
692 _pluginId, _componentClassId, \
693 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::init); \
694 BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID( \
695 _pluginId, _componentClassId, \
696 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::finalize); \
697 BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID( \
698 _pluginId, _componentClassId, \
699 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekBeginning, \
700 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::canSeekBeginning); \
701 BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID( \
702 _pluginId, _componentClassId, \
703 bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekNsFromOrigin, \
704 bt2::internal::MsgIterClsBridge< \
705 _userComponentClass::MessageIterator>::canSeekNsFromOrigin);
707 #define BT_CPP_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(_pluginId, _componentClassId, _name, \
708 _userComponentClass) \
709 BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID( \
710 _pluginId, _componentClassId, _name, \
711 bt2::internal::SinkCompClsBridge<_userComponentClass>::consume); \
712 BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID( \
713 _pluginId, _componentClassId, \
714 bt2::internal::SinkCompClsBridge<_userComponentClass>::init); \
715 BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID( \
716 _pluginId, _componentClassId, \
717 bt2::internal::SinkCompClsBridge<_userComponentClass>::finalize); \
718 BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID( \
719 _pluginId, _componentClassId, \
720 bt2::internal::SinkCompClsBridge<_userComponentClass>::getSupportedMipVersions); \
721 BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID( \
722 _pluginId, _componentClassId, \
723 bt2::internal::SinkCompClsBridge<_userComponentClass>::inputPortConnected); \
724 BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD_WITH_ID( \
725 _pluginId, _componentClassId, \
726 bt2::internal::SinkCompClsBridge<_userComponentClass>::graphIsConfigured); \
727 BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD_WITH_ID( \
728 _pluginId, _componentClassId, \
729 bt2::internal::SinkCompClsBridge<_userComponentClass>::query);
731 #define BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS(_name, _userComponentClass) \
732 BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass)
734 #define BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS(_name, _userComponentClass) \
735 BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass)
737 #define BT_CPP_PLUGIN_SINK_COMPONENT_CLASS(_name, _userComponentClass) \
738 BT_CPP_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass)
740 #endif /* BABELTRACE_CPP_COMMON_BT2_PLUGIN_DEV_HPP */