#ifndef MYNTEYE_PROCESSOR_H_ // NOLINT #define MYNTEYE_PROCESSOR_H_ #pragma once #include #include #include #include #include #include #include #include #include "mynteye/mynteye.h" #include "api/processor/object.h" MYNTEYE_BEGIN_NAMESPACE class Processor /*: public std::enable_shared_from_this*/ { public: using PreProcessCallback = std::function; using PostProcessCallback = std::function; using ProcessCallback = std::function; Processor(); virtual ~Processor(); virtual std::string Name(); void AddChild(const std::shared_ptr &child); void RemoveChild(const std::shared_ptr &child); std::list> GetChilds(); void SetPreProcessCallback(PreProcessCallback callback); void SetPostProcessCallback(PostProcessCallback callback); void SetProcessCallback(ProcessCallback callback); void Activate(); void Deactivate(); bool IsActivated(); bool IsIdle(); /** Returns dropped or not. */ bool Process(const Object *const in); /** * Returns the last output. * @note Returns null if not output now. */ Object *GetOutput(); std::uint64_t GetDroppedCount(); protected: virtual Object *OnCreateOutput() = 0; virtual void OnProcess( Object *const in, Object *const out, Processor *const parent) = 0; private: /** Run in standalone thread. */ void Run(); void SetIdle(bool idle); bool activated_; bool input_ready_; std::mutex mtx_input_ready_; std::condition_variable cond_input_ready_; bool idle_; std::uint64_t dropped_count_; std::mutex mtx_state_; std::unique_ptr input_; std::unique_ptr output_; std::unique_ptr output_result_; std::mutex mtx_result_; PreProcessCallback pre_callback_; PostProcessCallback post_callback_; ProcessCallback callback_; Processor *parent_; std::list> childs_; std::thread thread_; }; MYNTEYE_END_NAMESPACE #endif // MYNTEYE_PROCESSOR_H_ NOLINT