cpp-common/bt2: fix trivial-ish mistakes in plugin-dev.hpp
[babeltrace.git] / src / cpp-common / bt2 / plugin-dev.hpp
index 3bc20e7fcf025d9a918e17c2e8a5440e91305fb9..916ff1aeaa6bdfa269ba96c1ed0732c08e58a4c2 100644 (file)
@@ -64,12 +64,14 @@ public:
     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&) {
@@ -115,14 +117,15 @@ public:
     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;
@@ -232,8 +235,8 @@ struct SinkCompClsLibTypes final
 
 template <typename UserCompClsT>
 class SinkCompClsBridge final :
-    CompClsBridge<UserCompClsT, SinkCompClsLibTypes>,
-    CompClsBridgeWithInputPorts<SinkCompClsBridge<UserCompClsT>, SinkCompClsLibTypes>
+    public CompClsBridge<UserCompClsT, SinkCompClsLibTypes>,
+    public CompClsBridgeWithInputPorts<SinkCompClsBridge<UserCompClsT>, SinkCompClsLibTypes>
 {
 private:
     using CompClsBridge<UserCompClsT, SinkCompClsLibTypes>::userCompFromLibSelfCompPtr;
@@ -267,6 +270,7 @@ public:
     {
         try {
             userCompFromLibSelfCompPtr(libSelfCompPtr).graphIsConfigured();
+            return BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK;
         } catch (const std::bad_alloc&) {
             return BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_MEMORY_ERROR;
         } catch (const Error&) {
@@ -458,13 +462,17 @@ class UserMessageIterator;
  * 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}
@@ -501,28 +509,47 @@ private:
 /*
  * 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,
@@ -535,13 +562,13 @@ public:
     void outputPortConnected(const SelfComponentOutputPort outputPort,
                              const ConstInputPort inputPort)
     {
-        static_cast<UserComponentT&>(*this).outputPortConnected(outputPort, inputPort);
+        static_cast<UserComponentT&>(*this)._outputPortConnected(outputPort, inputPort);
     }
 
 protected:
     /* Overloadable */
     static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
-                                ConstValue)
+                                ConstValue, QueryDataT *)
     {
         throw UnknownObject {};
     }
@@ -559,7 +586,7 @@ protected:
     }
 
     template <typename DataT>
-    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT * const data)
+    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT& data)
     {
         return this->_selfComp().addOutputPort(name, data);
     }
@@ -578,29 +605,48 @@ protected:
 /*
  * 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,
@@ -625,7 +671,7 @@ public:
 protected:
     /* Overloadable */
     static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
-                                ConstValue)
+                                ConstValue, QueryDataT *)
     {
         throw UnknownObject {};
     }
@@ -648,7 +694,7 @@ protected:
     }
 
     template <typename DataT>
-    _OutputPorts::Port _addInputPort(const bt2c::CStringView name, DataT * const data)
+    _OutputPorts::Port _addInputPort(const bt2c::CStringView name, DataT& data)
     {
         return this->_selfComp().addInputPort(name, data);
     }
@@ -664,7 +710,7 @@ protected:
     }
 
     template <typename DataT>
-    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT * const data)
+    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT& data)
     {
         return this->_selfComp().addOutputPort(name, data);
     }
@@ -683,10 +729,14 @@ protected:
 /*
  * 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:
  *
@@ -694,24 +744,29 @@ protected:
  *
  * 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,
@@ -740,7 +795,7 @@ public:
 protected:
     /* Overloadable */
     static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
-                                ConstValue)
+                                ConstValue, QueryDataT *)
     {
         throw UnknownObject {};
     }
@@ -768,7 +823,7 @@ protected:
     }
 
     template <typename DataT>
-    _InputPorts::Port _addInputPort(const bt2c::CStringView name, DataT * const data)
+    _InputPorts::Port _addInputPort(const bt2c::CStringView name, DataT& data)
     {
         return this->_selfComp().addInputPort(name, data);
     }
@@ -1006,11 +1061,11 @@ protected:
 
 } /* 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(                                      \
@@ -1027,24 +1082,25 @@ protected:
         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(                                      \
@@ -1064,18 +1120,19 @@ protected:
         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)                            \
@@ -1101,15 +1158,11 @@ protected:
         _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)
This page took 0.03005 seconds and 4 git commands to generate.