|
@@ -0,0 +1,101 @@
|
|
|
|
+#ifndef BASE_HPP__
|
|
|
|
+#define BASE_HPP__
|
|
|
|
+
|
|
|
|
+#include "common/meta.hpp"
|
|
|
|
+#include "common/queue.hpp"
|
|
|
|
+#include "common/data.hpp"
|
|
|
|
+#include <queue>
|
|
|
|
+#include <unordered_map>
|
|
|
|
+#include <string>
|
|
|
|
+#include <thread>
|
|
|
|
+#include <mutex>
|
|
|
|
+#include <condition_variable>
|
|
|
|
+#include <memory>
|
|
|
|
+
|
|
|
|
+namespace Node
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+enum NODE_TYPE {
|
|
|
|
+ SRC_NODE, // 输入节点
|
|
|
|
+ MID_NODE, // 中间节点
|
|
|
|
+ DES_NODE, // 输出节点
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+class BaseNode
|
|
|
|
+{
|
|
|
|
+public:
|
|
|
|
+ BaseNode() = delete;
|
|
|
|
+ BaseNode(const std::string& name, NODE_TYPE type);
|
|
|
|
+ virtual ~BaseNode();
|
|
|
|
+
|
|
|
|
+ virtual void work() = 0;
|
|
|
|
+
|
|
|
|
+ void start();
|
|
|
|
+ void stop();
|
|
|
|
+
|
|
|
|
+ inline void add_input_buffer(const std::string& name, SharedQueue buffer)
|
|
|
|
+ {
|
|
|
|
+ std::unique_lock<std::mutex> lock(mutex_);
|
|
|
|
+ input_buffers_[name] = buffer;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline void add_output_buffer(const std::string& name, SharedQueue buffer)
|
|
|
|
+ {
|
|
|
|
+ std::unique_lock<std::mutex> lock(mutex_);
|
|
|
|
+ output_buffers_[name] = buffer;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline void del_input_buffer(const std::string& name)
|
|
|
|
+ {
|
|
|
|
+ std::unique_lock<std::mutex> lock(mutex_);
|
|
|
|
+ if (input_buffers_.find(name) == input_buffers_.end())
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ input_buffers_.erase(name);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline void del_output_buffer(const std::string& name)
|
|
|
|
+ {
|
|
|
|
+ std::unique_lock<std::mutex> lock(mutex_);
|
|
|
|
+ if (output_buffers_.find(name) == output_buffers_.end())
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ output_buffers_.erase(name);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline void is_running()
|
|
|
|
+ {
|
|
|
|
+ return running_;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ inline std::string get_name()
|
|
|
|
+ {
|
|
|
|
+ return name_;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+protected:
|
|
|
|
+ std::string name_;
|
|
|
|
+ NODE_TYPE type_;
|
|
|
|
+ std::thread worker_thread_;
|
|
|
|
+ std::mutex mutex_;
|
|
|
|
+ std::shared_ptr<std::condition_variable> cond_var_ =
|
|
|
|
+ std::make_shared<std::condition_variable>();
|
|
|
|
+ bool running_ = false;
|
|
|
|
+ std::unordered_map<std::string, SharedQueue<std::shared_ptr<meta::MetaData>>> input_buffers_;
|
|
|
|
+ std::unordered_map<std::string, SharedQueue<std::shared_ptr<meta::MetaData>>> output_buffers_;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static inline void LinkNode(const std::shared_ptr<BaseNode> &front,
|
|
|
|
+ const std::shared_ptr<BaseNode> &back)
|
|
|
|
+{
|
|
|
|
+ auto queue = std::make_shared<SharedQueue>();
|
|
|
|
+ back->add_input(front->get_name(), queue);
|
|
|
|
+ front->add_output(back->get_name(), queue);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif // BASE_HPP__
|