static bt_component_class_initialize_method_status init(const _LibSelfCompPtr libSelfCompPtr,
typename LibTypesT::SelfCompCfg *,
const bt_value * const libParamsPtr,
- void *) noexcept
+ void * const initData) noexcept
{
const auto selfComp = wrap(libSelfCompPtr);
try {
- const auto comp = new UserCompClsT {selfComp, wrap(libParamsPtr).asMap()};
+ const auto comp =
+ new UserCompClsT {selfComp, wrap(libParamsPtr).asMap(),
+ static_cast<typename UserCompClsT::InitData *>(initData)};
selfComp.data(*comp);
} catch (const std::bad_alloc&) {
static bt_component_class_query_method_status
query(typename LibTypesT::SelfCompCls * const libSelfCompClsPtr,
bt_private_query_executor * const libPrivQueryExecPtr, const char * const object,
- const bt_value * const libParamsPtr, void *,
+ const bt_value * const libParamsPtr, void * const data,
const bt_value ** const libResultPtr) noexcept
{
const auto privQueryExec = wrap(libPrivQueryExecPtr);
try {
- auto result = UserCompClsT::query(wrap(libSelfCompClsPtr), privQueryExec, object,
- wrap(libParamsPtr));
+ auto result = UserCompClsT::query(
+ wrap(libSelfCompClsPtr), privQueryExec, object, wrap(libParamsPtr),
+ static_cast<typename UserCompClsT::QueryData *>(data));
*libResultPtr = result.release().libObjPtr();
return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
* See the specific `bt2::UserSourceComponent`,
* `bt2::UserFilterComponent`, and `bt2::UserSinkComponent`.
*/
-template <typename SelfCompT>
+template <typename SelfCompT, typename InitDataT, typename QueryDataT>
class UserComponent
{
/* Give a related message iterator access to this logger */
template <typename, typename>
friend class UserMessageIterator;
+public:
+ using InitData = InitDataT;
+ using QueryData = QueryDataT;
+
protected:
explicit UserComponent(const SelfCompT selfComp, const std::string& logTag) :
_mLogger {selfComp, fmt::format("{}/[{}]", logTag, selfComp.name())}, _mSelfComp {selfComp}
/*
* Base class of a user source component `UserComponentT` (CRTP).
*
- * `UserComponentT::UserComponentT()` must accept a
- * `bt2::SelfSourceComponent` parameter, which it needs to forward to
- * bt2::UserSourceComponent::UserSourceComponent(), and a
- * `bt2::ConstValue` parameter (initialization parameters).
+ * UserComponentT::UserComponentT() must accept, in this order:
+ *
+ * 1. A `bt2::SelfSourceComponent` parameter, which it needs to forward
+ * to bt2::UserSourceComponent::UserSourceComponent().
+ *
+ * 2. A `bt2::ConstValue` parameter (the initialization parameters).
+ *
+ * 3. An `InitDataT *` parameter (the initialization method data).
+ *
+ * `UserMessageIteratorT`, the message iterator class to use, must inherit
+ * `UserMessageIterator`.
+ *
+ * UserComponentT::_query() receives a query method data pointer of type
+ * `QueryDataT *` as its last parameter.
*/
-template <typename UserComponentT>
-class UserSourceComponent : public UserComponent<SelfSourceComponent>
+template <typename UserComponentT, typename UserMessageIteratorT, typename InitDataT = void,
+ typename QueryDataT = void>
+class UserSourceComponent : public UserComponent<SelfSourceComponent, InitDataT, QueryDataT>
{
+ static_assert(std::is_base_of<UserMessageIterator<UserMessageIteratorT, UserComponentT>,
+ UserMessageIteratorT>::value,
+ "`UserMessageIteratorT` inherits `UserMessageIterator`");
+
+public:
+ using MessageIterator = UserMessageIteratorT;
+
protected:
using _OutputPorts = SelfSourceComponent::OutputPorts;
explicit UserSourceComponent(const SelfSourceComponent selfComp, const std::string& logTag) :
- UserComponent<SelfSourceComponent> {selfComp, logTag}
+ UserComponent<SelfSourceComponent, InitDataT, QueryDataT> {selfComp, logTag}
{
}
public:
static Value::Shared query(const SelfComponentClass selfCompCls,
const PrivateQueryExecutor privQueryExec,
- const bt2c::CStringView obj, const ConstValue params)
+ const bt2c::CStringView obj, const ConstValue params,
+ QueryDataT * const data)
{
- return UserComponentT::_query(selfCompCls, privQueryExec, obj, params);
+ return UserComponentT::_query(selfCompCls, privQueryExec, obj, params, data);
}
static void getSupportedMipVersions(const SelfComponentClass selfCompCls,
protected:
/* Overloadable */
static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
- ConstValue)
+ ConstValue, QueryDataT *)
{
throw UnknownObject {};
}
/*
* Base class of a user filter component `UserComponentT` (CRTP).
*
- * `UserComponentT::UserComponentT()` must accept a
- * `bt2::SelfFilterComponent` parameter, which it needs to forward to
- * bt2::UserFilterComponent::UserFilterComponent(), and a
- * `bt2::ConstValue` parameter (initialization parameters).
+ * UserComponentT::UserComponentT() must accept, in this order:
+ *
+ * 1. A `bt2::SelfFilterComponent` parameter, which it needs to forward
+ * to bt2::UserFilterComponent::UserFilterComponent().
+ *
+ * 2. A `bt2::ConstValue` parameter (the initialization parameters).
+ *
+ * 3. An `InitDataT *` parameter (the initialization method data).
+ *
+ * `UserMessageIteratorT`, the message iterator class to use, must inherit
+ * `UserMessageIterator`.
+ *
+ * UserComponentT::_query() receives a query method data pointer of type
+ * `QueryDataT *` as its last parameter.
*/
-template <typename UserComponentT>
-class UserFilterComponent : public UserComponent<SelfFilterComponent>
+template <typename UserComponentT, typename UserMessageIteratorT, typename InitDataT = void,
+ typename QueryDataT = void>
+class UserFilterComponent : public UserComponent<SelfFilterComponent, InitDataT, QueryDataT>
{
+ static_assert(std::is_base_of<UserMessageIterator<UserMessageIteratorT, UserComponentT>,
+ UserMessageIteratorT>::value,
+ "`UserMessageIteratorT` inherits `UserMessageIterator`");
+
+public:
+ using MessageIterator = UserMessageIteratorT;
+
protected:
using _InputPorts = SelfFilterComponent::InputPorts;
using _OutputPorts = SelfFilterComponent::OutputPorts;
explicit UserFilterComponent(const SelfFilterComponent selfComp, const std::string& logTag) :
- UserComponent<SelfFilterComponent> {selfComp, logTag}
+ UserComponent<SelfFilterComponent, InitDataT, QueryDataT> {selfComp, logTag}
{
}
public:
static Value::Shared query(const SelfComponentClass selfCompCls,
const PrivateQueryExecutor privQueryExec,
- const bt2c::CStringView obj, const ConstValue params)
+ const bt2c::CStringView obj, const ConstValue params,
+ QueryDataT * const data)
{
- return UserComponentT::_query(selfCompCls, privQueryExec, obj, params);
+ return UserComponentT::_query(selfCompCls, privQueryExec, obj, params, data);
}
static void getSupportedMipVersions(const SelfComponentClass selfCompCls,
protected:
/* Overloadable */
static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
- ConstValue)
+ ConstValue, QueryDataT *)
{
throw UnknownObject {};
}
/*
* Base class of a user sink component `UserComponentT` (CRTP).
*
- * `UserComponentT::UserComponentT()` must accept a
- * `bt2::SelfSinkComponent` parameter, which it needs to forward to
- * bt2::UserSinkComponent::UserSinkComponent(), and a `bt2::ConstValue`
- * parameter (initialization parameters).
+ * UserComponentT::UserComponentT() must accept, in this order:
+ *
+ * 1. A `bt2::SelfSinkComponent` parameter, which it needs to forward
+ * to bt2::UserSinkComponent::UserSinkComponent().
+ *
+ * 2. A `bt2::ConstValue` parameter (the initialization parameters).
+ *
+ * 3. An `InitDataT *` parameter (the initialization method data).
*
* `UserComponentT` must implement:
*
*
* This method returns `true` if the sink component still needs to
* consume, or `false` if it's finished.
+ *
+ * UserComponentT::_query() receives a query method data pointer of type
+ * `QueryDataT *` as its last parameter.
+
*/
-template <typename UserComponentT>
-class UserSinkComponent : public UserComponent<SelfSinkComponent>
+template <typename UserComponentT, typename InitDataT = void, typename QueryDataT = void>
+class UserSinkComponent : public UserComponent<SelfSinkComponent, InitDataT, QueryDataT>
{
protected:
using _InputPorts = SelfSinkComponent::InputPorts;
explicit UserSinkComponent(const SelfSinkComponent selfComp, const std::string& logTag) :
- UserComponent<SelfSinkComponent> {selfComp, logTag}
+ UserComponent<SelfSinkComponent, InitDataT, QueryDataT> {selfComp, logTag}
{
}
public:
static Value::Shared query(const SelfComponentClass selfCompCls,
const PrivateQueryExecutor privQueryExec,
- const bt2c::CStringView obj, const ConstValue params)
+ const bt2c::CStringView obj, const ConstValue params,
+ QueryDataT * const data)
{
- return UserComponentT::_query(selfCompCls, privQueryExec, obj, params);
+ return UserComponentT::_query(selfCompCls, privQueryExec, obj, params, data);
}
static void getSupportedMipVersions(const SelfComponentClass selfCompCls,
protected:
/* Overloadable */
static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
- ConstValue)
+ ConstValue, QueryDataT *)
{
throw UnknownObject {};
}
} /* namespace bt2 */
-#define BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID( \
- _pluginId, _componentClassId, _name, _userComponentClass, _userMessageIteratorClass) \
+#define BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(_pluginId, _componentClassId, _name, \
+ _userComponentClass) \
BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID( \
_pluginId, _componentClassId, _name, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::next); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::next); \
BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID( \
_pluginId, _componentClassId, bt2::internal::SrcCompClsBridge<_userComponentClass>::init); \
BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID( \
bt2::internal::SrcCompClsBridge<_userComponentClass>::query); \
BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::init); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::init); \
BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::finalize); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::finalize); \
BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::seekBeginning, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::canSeekBeginning); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekBeginning, \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::canSeekBeginning); \
BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::seekNsFromOrigin, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::canSeekNsFromOrigin);
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekNsFromOrigin, \
+ bt2::internal::MsgIterClsBridge< \
+ _userComponentClass::MessageIterator>::canSeekNsFromOrigin);
-#define BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID( \
- _pluginId, _componentClassId, _name, _userComponentClass, _userMessageIteratorClass) \
+#define BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(_pluginId, _componentClassId, _name, \
+ _userComponentClass) \
BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID( \
_pluginId, _componentClassId, _name, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::next); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::next); \
BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID( \
_pluginId, _componentClassId, bt2::internal::FltCompClsBridge<_userComponentClass>::init); \
BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID( \
bt2::internal::FltCompClsBridge<_userComponentClass>::query); \
BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::init); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::init); \
BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::finalize); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::finalize); \
BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::seekBeginning, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::canSeekBeginning); \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekBeginning, \
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::canSeekBeginning); \
BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID( \
_pluginId, _componentClassId, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::seekNsFromOrigin, \
- bt2::internal::MsgIterClsBridge<_userMessageIteratorClass>::canSeekNsFromOrigin);
+ bt2::internal::MsgIterClsBridge<_userComponentClass::MessageIterator>::seekNsFromOrigin, \
+ bt2::internal::MsgIterClsBridge< \
+ _userComponentClass::MessageIterator>::canSeekNsFromOrigin);
#define BT_CPP_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(_pluginId, _componentClassId, _name, \
_userComponentClass) \
_pluginId, _componentClassId, \
bt2::internal::SinkCompClsBridge<_userComponentClass>::query);
-#define BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS(_name, _userComponentClass, \
- _userMessageIteratorClass) \
- BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass, \
- _userMessageIteratorClass)
+#define BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS(_name, _userComponentClass) \
+ BT_CPP_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass)
-#define BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS(_name, _userComponentClass, \
- _userMessageIteratorClass) \
- BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass, \
- _userMessageIteratorClass)
+#define BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS(_name, _userComponentClass) \
+ BT_CPP_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass)
#define BT_CPP_PLUGIN_SINK_COMPONENT_CLASS(_name, _userComponentClass) \
BT_CPP_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _userComponentClass)