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, typename InitDataT>
+template <typename SelfCompT, typename InitDataT, typename QueryDataT>
class UserComponent
{
/* Give a related message iterator access to this logger */
public:
using InitData = InitDataT;
+ using QueryData = QueryDataT;
protected:
explicit UserComponent(const SelfCompT selfComp, const std::string& logTag) :
*
* `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, typename UserMessageIteratorT, typename InitDataT = void>
-class UserSourceComponent : public UserComponent<SelfSourceComponent, InitDataT>
+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,
using _OutputPorts = SelfSourceComponent::OutputPorts;
explicit UserSourceComponent(const SelfSourceComponent selfComp, const std::string& logTag) :
- UserComponent<SelfSourceComponent, InitDataT> {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 {};
}
*
* `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, typename UserMessageIteratorT, typename InitDataT = void>
-class UserFilterComponent : public UserComponent<SelfFilterComponent, InitDataT>
+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,
using _OutputPorts = SelfFilterComponent::OutputPorts;
explicit UserFilterComponent(const SelfFilterComponent selfComp, const std::string& logTag) :
- UserComponent<SelfFilterComponent, InitDataT> {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 {};
}
*
* 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, typename InitDataT = void>
-class UserSinkComponent : public UserComponent<SelfSinkComponent, InitDataT>
+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, InitDataT> {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 {};
}