/*
 * task_command_manager 是任务单的总管理，单例模式
 * 负责管理任务单的派送和转发
 * 所有的任务发送方都只需要调用 task_command_manager.get_instance_references().execute_task(p_task_base)
 * 然后task_command_manager去找到对应的接受对象，来调用该对象的接口函数。 例如Laser_base::execute_task
 * 这样发送方和接收方不直接绑定，双方完全独立。
 * 没有在实例里面保存对方的回调函数或者对象指针
 *
 * */

#ifndef TASK_COMAND_MANAGER_H
#define TASK_COMAND_MANAGER_H
#include <string>
#include "error_code/error_code.hpp"
#include "task/task_base.h"
#include "tool/singleton.h"


class Task_command_manager:public Singleton<Task_command_manager>
{
// 子类必须把父类设定为友元函数，这样父类才能使用子类的私有构造函数。
	friend class Singleton<Task_command_manager>;
public:
// 必须关闭拷贝构造和赋值构造，只能通过 get_instance 函数来进行操作唯一的实例。
	Task_command_manager(const Task_command_manager&)=delete;
	Task_command_manager& operator =(const Task_command_manager&)= delete;
	~Task_command_manager()=default;
private:
// 父类的构造函数必须保护，子类的构造函数必须私有。
	Task_command_manager()=default;

public:
	//对外的接口函数，所有的任务发送方，都必须使用该函数。
	//execute_task在内部解析了Task_Base里面的Task_type，然后转发给具体某个模块的实例对象。
	//input：p_task_base 任务单，基类的指针，指向子类的实例，（多态）
	Error_manager execute_task(Task_Base* p_task_base);
};



#endif //TASK_COMAND_MANAGER_H

