src/cpp-common: pass user message iterator class to `UserSourceComponent` and `UserFi...
[babeltrace.git] / src / cpp-common / bt2 / plugin-dev.hpp
index 220d1061cc0bda624738bc96379d052ee7ba3cdf..2f255e42af9f54d845c8503a58d5206e8b9d06b8 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <babeltrace2/babeltrace.h>
 
+#include "cpp-common/bt2c/c-string-view.hpp"
 #include "cpp-common/bt2c/logging.hpp"
 #include "cpp-common/vendor/fmt/core.h"
 
 namespace bt2 {
 namespace internal {
 
-constexpr const char *unhandledExcLogStr() noexcept
+constexpr bt2c::CStringView unhandledExcLogStr() noexcept
 {
     return "Unhandled exception.";
 }
 
-constexpr const char *unhandledExcLogTag() noexcept
+constexpr bt2c::CStringView unhandledExcLogTag() noexcept
 {
     return "PLUGIN-DEV-HPP";
 }
@@ -471,7 +472,7 @@ protected:
     }
 
 protected:
-    const char *_name() const noexcept
+    bt2c::CStringView _name() const noexcept
     {
         return _mSelfComp.name();
     }
@@ -504,10 +505,20 @@ private:
  * `bt2::SelfSourceComponent` parameter, which it needs to forward to
  * bt2::UserSourceComponent::UserSourceComponent(), and a
  * `bt2::ConstValue` parameter (initialization parameters).
+ *
+ * `UserMessageIteratorT`, the message iterator class to use, must inherit
+ * `UserMessageIterator`.
  */
-template <typename UserComponentT>
+template <typename UserComponentT, typename UserMessageIteratorT>
 class UserSourceComponent : public UserComponent<SelfSourceComponent>
 {
+    static_assert(std::is_base_of<UserMessageIterator<UserMessageIteratorT, UserComponentT>,
+                                  UserMessageIteratorT>::value,
+                  "`UserMessageIteratorT` inherits `UserMessageIterator`");
+
+public:
+    using MessageIterator = UserMessageIteratorT;
+
 protected:
     using _OutputPorts = SelfSourceComponent::OutputPorts;
 
@@ -518,8 +529,8 @@ protected:
 
 public:
     static Value::Shared query(const SelfComponentClass selfCompCls,
-                               const PrivateQueryExecutor privQueryExec, const char * const obj,
-                               const ConstValue params)
+                               const PrivateQueryExecutor privQueryExec,
+                               const bt2c::CStringView obj, const ConstValue params)
     {
         return UserComponentT::_query(selfCompCls, privQueryExec, obj, params);
     }
@@ -539,7 +550,8 @@ public:
 
 protected:
     /* Overloadable */
-    static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, const char *, ConstValue)
+    static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
+                                ConstValue)
     {
         throw UnknownObject {};
     }
@@ -557,23 +569,12 @@ protected:
     }
 
     template <typename DataT>
-    _OutputPorts::Port _addOutputPort(const char * const name, DataT * const data)
+    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT * const data)
     {
         return this->_selfComp().addOutputPort(name, data);
     }
 
-    _OutputPorts::Port _addOutputPort(const char *name)
-    {
-        return this->_selfComp().addOutputPort(name);
-    }
-
-    template <typename DataT>
-    _OutputPorts::Port _addOutputPort(const std::string& name, DataT * const data)
-    {
-        return this->_selfComp().addOutputPort(name, data);
-    }
-
-    _OutputPorts::Port _addOutputPort(const std::string& name)
+    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name)
     {
         return this->_selfComp().addOutputPort(name);
     }
@@ -591,10 +592,20 @@ protected:
  * `bt2::SelfFilterComponent` parameter, which it needs to forward to
  * bt2::UserFilterComponent::UserFilterComponent(), and a
  * `bt2::ConstValue` parameter (initialization parameters).
+ *
+ * `UserMessageIteratorT`, the message iterator class to use, must inherit
+ * `UserMessageIterator`.
  */
-template <typename UserComponentT>
+template <typename UserComponentT, typename UserMessageIteratorT>
 class UserFilterComponent : public UserComponent<SelfFilterComponent>
 {
+    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;
@@ -606,8 +617,8 @@ protected:
 
 public:
     static Value::Shared query(const SelfComponentClass selfCompCls,
-                               const PrivateQueryExecutor privQueryExec, const char * const obj,
-                               const ConstValue params)
+                               const PrivateQueryExecutor privQueryExec,
+                               const bt2c::CStringView obj, const ConstValue params)
     {
         return UserComponentT::_query(selfCompCls, privQueryExec, obj, params);
     }
@@ -633,7 +644,8 @@ public:
 
 protected:
     /* Overloadable */
-    static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, const char *, ConstValue)
+    static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
+                                ConstValue)
     {
         throw UnknownObject {};
     }
@@ -656,23 +668,12 @@ protected:
     }
 
     template <typename DataT>
-    _OutputPorts::Port _addInputPort(const char * const name, DataT * const data)
-    {
-        return this->_selfComp().addInputPort(name, data);
-    }
-
-    _InputPorts::Port _addInputPort(const char *name)
-    {
-        return this->_selfComp().addInputPort(name);
-    }
-
-    template <typename DataT>
-    _InputPorts::Port _addInputPort(const std::string& name, DataT * const data)
+    _OutputPorts::Port _addInputPort(const bt2c::CStringView name, DataT * const data)
     {
         return this->_selfComp().addInputPort(name, data);
     }
 
-    _InputPorts::Port _addInputPort(const std::string& name)
+    _InputPorts::Port _addInputPort(const bt2c::CStringView name)
     {
         return this->_selfComp().addInputPort(name);
     }
@@ -683,23 +684,12 @@ protected:
     }
 
     template <typename DataT>
-    _OutputPorts::Port _addOutputPort(const char * const name, DataT * const data)
+    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name, DataT * const data)
     {
         return this->_selfComp().addOutputPort(name, data);
     }
 
-    _OutputPorts::Port _addOutputPort(const char *name)
-    {
-        return this->_selfComp().addOutputPort(name);
-    }
-
-    template <typename DataT>
-    _OutputPorts::Port _addOutputPort(const std::string& name, DataT * const data)
-    {
-        return this->_selfComp().addOutputPort(name, data);
-    }
-
-    _OutputPorts::Port _addOutputPort(const std::string& name)
+    _OutputPorts::Port _addOutputPort(const bt2c::CStringView name)
     {
         return this->_selfComp().addOutputPort(name);
     }
@@ -738,8 +728,8 @@ protected:
 
 public:
     static Value::Shared query(const SelfComponentClass selfCompCls,
-                               const PrivateQueryExecutor privQueryExec, const char * const obj,
-                               const ConstValue params)
+                               const PrivateQueryExecutor privQueryExec,
+                               const bt2c::CStringView obj, const ConstValue params)
     {
         return UserComponentT::_query(selfCompCls, privQueryExec, obj, params);
     }
@@ -769,7 +759,8 @@ public:
 
 protected:
     /* Overloadable */
-    static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, const char *, ConstValue)
+    static Value::Shared _query(SelfComponentClass, PrivateQueryExecutor, bt2c::CStringView,
+                                ConstValue)
     {
         throw UnknownObject {};
     }
@@ -797,23 +788,12 @@ protected:
     }
 
     template <typename DataT>
-    _InputPorts::Port _addInputPort(const char * const name, DataT * const data)
-    {
-        return this->_selfComp().addInputPort(name, data);
-    }
-
-    _InputPorts::Port _addInputPort(const char *name)
-    {
-        return this->_selfComp().addInputPort(name);
-    }
-
-    template <typename DataT>
-    _InputPorts::Port _addInputPort(const std::string& name, DataT * const data)
+    _InputPorts::Port _addInputPort(const bt2c::CStringView name, DataT * const data)
     {
         return this->_selfComp().addInputPort(name, data);
     }
 
-    _InputPorts::Port _addInputPort(const std::string& name)
+    _InputPorts::Port _addInputPort(const bt2c::CStringView name)
     {
         return this->_selfComp().addInputPort(name);
     }
@@ -1046,11 +1026,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(                                      \
@@ -1067,24 +1047,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(                                      \
@@ -1104,18 +1085,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)                            \
@@ -1141,15 +1123,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.027421 seconds and 4 git commands to generate.