Skip to main content

LambdaStage.h File

Function-based stage executor wrapper. More...

Included Headers

#include "graph/StageExecutor.h" #include "graph/nodes/StageNode.h" #include <functional> #include <memory> #include <string> #include <utility> #include <vector>

Namespaces Index

namespacesimaai
namespaceneat
namespacegraph
namespacenodes

Classes Index

classLambdaStage

Generic stage executor whose behavior is supplied by user-provided callbacks. More...

Description

Function-based stage executor wrapper.

File Listing

The file content with the documentation metadata removed is:

1
6#pragma once
7
10
11#include <functional>
12#include <memory>
13#include <string>
14#include <utility>
15#include <vector>
16
18
21using LambdaOnInput = std::function<void(StageMsg&&, std::vector<StageOutMsg>&, const StagePorts&)>;
25 std::function<void(std::int64_t, std::vector<StageOutMsg>&, const StagePorts&)>;
26
39public:
42 : on_input_(std::move(on_input)), on_tick_(std::move(on_tick)) {
43 if (!on_input_) {
44 throw std::invalid_argument("LambdaStage: on_input function is required");
45 }
46 }
47
49 void set_ports(const StagePorts& ports) override {
50 ports_ = ports;
51 }
52
54 void on_input(StageMsg&& msg, std::vector<StageOutMsg>& out) override {
55 on_input_(std::move(msg), out, ports_);
56 }
57
59 void on_tick(std::int64_t now_ns, std::vector<StageOutMsg>& out) override {
60 if (on_tick_)
61 on_tick_(now_ns, out, ports_);
62 }
63
64private:
65 StagePorts ports_;
66 LambdaOnInput on_input_;
67 LambdaOnTick on_tick_;
68};
69
83inline std::shared_ptr<simaai::neat::graph::Node>
84LambdaStageNode(std::string kind, std::vector<std::string> inputs, std::vector<std::string> outputs,
85 LambdaOnInput on_input, std::string label = {}, StageNodeOptions options = {},
86 StageNode::OutputSpecFn out_fn = {}, LambdaOnTick on_tick = {}) {
87 LambdaOnInput fn = std::move(on_input);
88 LambdaOnTick tick = std::move(on_tick);
89 StageNode::StageExecutorFactory factory = [fn, tick]() mutable {
90 return std::make_unique<LambdaStage>(fn, tick);
91 };
92
93 std::vector<PortDesc> in_ports;
94 in_ports.reserve(inputs.size());
95 for (auto& name : inputs) {
96 in_ports.push_back(PortDesc{.name = std::move(name), .spec = OutputSpec{}});
97 }
98
99 std::vector<PortDesc> out_ports;
100 out_ports.reserve(outputs.size());
101 for (auto& name : outputs) {
102 out_ports.push_back(PortDesc{.name = std::move(name), .spec = OutputSpec{}});
103 }
104
105 return std::make_shared<StageNode>(std::move(kind), std::move(factory), std::move(in_ports),
106 std::move(out_ports), std::move(label), std::move(out_fn),
107 std::move(options));
108}
109
110} // namespace simaai::neat::graph::nodes

Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.