* Copyright (C) 2020-2023 EfficiOS, inc.
*/
-#include <utility>
-
-#include "run-in.hpp"
#include "common/assert.h"
+#include "cpp-common/bt2/component-class-dev.hpp"
+#include "cpp-common/bt2/component-class.hpp"
+#include "cpp-common/bt2/graph.hpp"
+#include "cpp-common/bt2/plugin-load.hpp"
+#include "cpp-common/bt2/plugin.hpp"
+#include "cpp-common/bt2/query-executor.hpp"
+#include "cpp-common/bt2c/call.hpp"
-struct RunInData final
-{
- RunInCompClsQueryFunc compClsCtxFunc;
- RunInCompClsInitFunc compCtxFunc;
- RunInMsgIterClsInitFunc msgIterCtxFunc;
-};
+#include "run-in.hpp"
-static const RunInData& runInDataFromMethodData(void * const methodData)
+void RunIn::onQuery(bt2::SelfComponentClass)
{
- return *static_cast<const RunInData *>(methodData);
}
-static bt_component_class_initialize_method_status
-compClsInit(bt_self_component_source * const selfComp, bt_self_component_source_configuration *,
- const bt_value *, void * const initMethodData)
+void RunIn::onCompInit(bt2::SelfComponent)
{
- const auto status =
- bt_self_component_source_add_output_port(selfComp, "out", initMethodData, nullptr);
-
- BT_ASSERT(status == BT_SELF_COMPONENT_ADD_PORT_STATUS_OK);
-
- auto& data = runInDataFromMethodData(initMethodData);
-
- if (data.compCtxFunc) {
- data.compCtxFunc(bt_self_component_source_as_self_component(selfComp));
- }
-
- return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK;
}
-static bt_component_class_query_method_status
-compClsQuery(bt_self_component_class_source * const selfCompCls, bt_private_query_executor *,
- const char *, const bt_value *, void * const methodData,
- const bt_value ** const result)
+void RunIn::onMsgIterInit(bt2::SelfMessageIterator)
{
- auto& data = runInDataFromMethodData(methodData);
-
- if (data.compClsCtxFunc) {
- data.compClsCtxFunc(bt_self_component_class_source_as_self_component_class(selfCompCls));
- }
-
- *result = bt_value_null;
- return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
}
-static bt_message_iterator_class_initialize_method_status
-msgIterClsInit(bt_self_message_iterator * const selfMsgIter,
- bt_self_message_iterator_configuration *, bt_self_component_port_output * const port)
+void RunIn::onMsgIterNext(bt2::SelfMessageIterator, bt2::ConstMessageArray&)
{
- auto& data = runInDataFromMethodData(bt_self_component_port_get_data(
- bt_self_component_port_output_as_self_component_port(port)));
-
- if (data.msgIterCtxFunc) {
- data.msgIterCtxFunc(selfMsgIter);
- }
-
- return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK;
}
-static bt_message_iterator_class_next_method_status
-msgIterClsNext(bt_self_message_iterator *, bt_message_array_const, uint64_t, uint64_t *)
-{
- return BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END;
-}
-
-void runIn(RunInCompClsQueryFunc compClsCtxFunc, RunInCompClsInitFunc compCtxFunc,
- RunInMsgIterClsInitFunc msgIterCtxFunc)
-{
- RunInData data {std::move(compClsCtxFunc), std::move(compCtxFunc), std::move(msgIterCtxFunc)};
+namespace {
- /* Create and configure custom source component class */
- const auto msgIterCls = bt_message_iterator_class_create(msgIterClsNext);
-
- BT_ASSERT(msgIterCls);
+class RunInSource;
+class RunInSourceMsgIter final : public bt2::UserMessageIterator<RunInSourceMsgIter, RunInSource>
+{
+public:
+ explicit RunInSourceMsgIter(const bt2::SelfMessageIterator self,
+ bt2::SelfMessageIteratorConfiguration,
+ const bt2::SelfComponentOutputPort port) :
+ bt2::UserMessageIterator<RunInSourceMsgIter, RunInSource> {self, "RUN-IN-SRC-MSG-ITER"},
+ _mRunIn {&port.data<RunIn>()}, _mSelf {self}
{
- const auto status =
- bt_message_iterator_class_set_initialize_method(msgIterCls, msgIterClsInit);
-
- BT_ASSERT(status == BT_MESSAGE_ITERATOR_CLASS_SET_METHOD_STATUS_OK);
+ _mRunIn->onMsgIterInit(self);
}
- const auto srcCompCls = bt_component_class_source_create("yo", msgIterCls);
-
- BT_ASSERT(srcCompCls);
-
+ void _next(bt2::ConstMessageArray& msgs)
{
- const auto status =
- bt_component_class_source_set_initialize_method(srcCompCls, compClsInit);
-
- BT_ASSERT(status == BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK);
+ _mRunIn->onMsgIterNext(_mSelf, msgs);
}
- {
- const auto status = bt_component_class_source_set_query_method(srcCompCls, compClsQuery);
+private:
+ RunIn *_mRunIn;
+ bt2::SelfMessageIterator _mSelf;
+};
- BT_ASSERT(status == BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK);
+class RunInSource final :
+ public bt2::UserSourceComponent<RunInSource, RunInSourceMsgIter, RunIn, RunIn>
+{
+public:
+ static constexpr auto name = "run-in-src";
+
+ explicit RunInSource(const bt2::SelfSourceComponent self, bt2::ConstMapValue,
+ RunIn * const runIn) :
+ bt2::UserSourceComponent<RunInSource, RunInSourceMsgIter, RunIn, RunIn> {self,
+ "RUN-IN-SRC"},
+ _mRunIn {runIn}
+ {
+ this->_addOutputPort("out", *runIn);
+ _mRunIn->onCompInit(self);
}
- /* Execute a query (executes `compClsCtxFunc`) */
+ static bt2::Value::Shared _query(const bt2::SelfComponentClass self, bt2::PrivateQueryExecutor,
+ bt2c::CStringView, bt2::ConstValue, RunIn *data)
{
- const auto queryExec = bt_query_executor_create_with_method_data(
- bt_component_class_source_as_component_class(srcCompCls), "", nullptr, &data);
+ data->onQuery(self);
+ return bt2::NullValue {}.shared();
+ }
- BT_ASSERT(queryExec);
+private:
+ RunIn *_mRunIn;
+};
- const bt_value *queryRes;
- const auto status = bt_query_executor_query(queryExec, &queryRes);
+} /* namespace */
- BT_ASSERT(status == BT_QUERY_EXECUTOR_QUERY_STATUS_OK);
+void runIn(RunIn& runIn)
+{
+ const auto srcCompCls = bt2::SourceComponentClass::create<RunInSource>();
- bt_value_put_ref(queryRes);
- bt_query_executor_put_ref(queryExec);
- }
+ /* Execute a query */
+ bt2::QueryExecutor::create(*srcCompCls, "object-name", runIn)->query();
/* Create graph */
- const auto graph = bt_graph_create(0);
-
- BT_ASSERT(graph);
+ const auto graph = bt2::Graph::create(0);
/* Add custom source component (executes `compCtxFunc`) */
- const bt_component_source *srcComp;
-
- {
- const auto status = bt_graph_add_source_component_with_initialize_method_data(
- graph, srcCompCls, "whatever", NULL, &data, BT_LOGGING_LEVEL_NONE, &srcComp);
-
- BT_ASSERT(status == BT_GRAPH_ADD_COMPONENT_STATUS_OK);
- }
+ const auto srcComp = graph->addComponent(*srcCompCls, "the-source", runIn);
- /* Find `sink.utils.dummy` component class */
- const bt_plugin *utilsPlugin = nullptr;
+ /* Add dummy sink component */
+ const auto sinkComp = bt2c::call([&] {
+ const auto utilsPlugin = bt2::findPlugin("utils");
- {
- const auto status =
- bt_plugin_find("utils", BT_TRUE, BT_TRUE, BT_TRUE, BT_TRUE, BT_TRUE, &utilsPlugin);
-
- BT_ASSERT(status == BT_PLUGIN_FIND_STATUS_OK);
- }
-
- /* Add `sink.utils.dummy` component */
- const bt_component_sink *sinkComp;
+ BT_ASSERT(utilsPlugin);
- {
- const auto dummyCompCls =
- bt_plugin_borrow_sink_component_class_by_name_const(utilsPlugin, "dummy");
-
- BT_ASSERT(dummyCompCls);
+ const auto dummySinkCompCls = utilsPlugin->sinkComponentClasses()["dummy"];
- const auto status = bt_graph_add_sink_component(graph, dummyCompCls, "the-sink", nullptr,
- BT_LOGGING_LEVEL_NONE, &sinkComp);
+ BT_ASSERT(dummySinkCompCls);
- BT_ASSERT(status == BT_GRAPH_ADD_COMPONENT_STATUS_OK);
- }
+ return graph->addComponent(*dummySinkCompCls, "the-sink");
+ });
/* Connect ports */
- {
- const auto outPort = bt_component_source_borrow_output_port_by_name_const(srcComp, "out");
+ const auto outPort = srcComp.outputPorts()["out"];
+ BT_ASSERT(outPort);
- BT_ASSERT(outPort);
+ const auto inPort = sinkComp.inputPorts()["in"];
+ BT_ASSERT(inPort);
- const auto inPort = bt_component_sink_borrow_input_port_by_name_const(sinkComp, "in");
-
- BT_ASSERT(inPort);
-
- const auto status = bt_graph_connect_ports(graph, outPort, inPort, nullptr);
-
- BT_ASSERT(status == BT_GRAPH_CONNECT_PORTS_STATUS_OK);
- }
+ graph->connectPorts(*outPort, *inPort);
/* Run graph (executes `msgIterCtxFunc`) */
- const auto status = bt_graph_run(graph);
-
- BT_ASSERT(status == BT_GRAPH_RUN_STATUS_OK);
-
- /* Discard plugin and graph */
- bt_plugin_put_ref(utilsPlugin);
- bt_graph_put_ref(graph);
- bt_component_class_source_put_ref(srcCompCls);
- bt_message_iterator_class_put_ref(msgIterCls);
-}
-
-void runInCompClsQuery(RunInCompClsQueryFunc func)
-{
- runIn(std::move(func), nullptr, nullptr);
-}
-
-void runInCompClsInit(RunInCompClsInitFunc func)
-{
- runIn(nullptr, std::move(func), nullptr);
-}
-
-void runInMsgIterClsInit(RunInMsgIterClsInitFunc func)
-{
- runIn(nullptr, nullptr, std::move(func));
+ graph->run();
}