#ifndef _WORKER_HPP_
#define _WORKER_HPP_
#include <ev++.h>
#include <atomic>
#include <vector>

struct task
{
	uint32_t m_cmd_code;
	uint32_t m_hash_id;

	task(uint32_t hash_id,uint32_t cmd_code)
		:m_cmd_code(cmd_code)
		,m_hash_id(hash_id)
	{
	}

	task()
	{}

	void destroy()
	{
		delete this;
	}

	template<typename T> const T&body()const
	{
		return *(T*)this;
	}

	template<typename T> T&body()
	{
		return *(T*)this;
	}

	template<typename T> static task*alloc()
	{
		return new T();
	}

	virtual ~task(){}
};

struct area_business;
struct message_change_business:task
{
	int area_id;
	std::atomic<int> ref_count;
	std::vector<area_business*> del_list,add_list,new_list;
};

struct worker
{
	virtual void stop()=0;
	virtual void request(task*tk)=0;
	virtual void broadcast(task*tk) 
	{
	}

	virtual int  num_thread()
	{
		return 1;
	}

	static worker*instance();
};

#endif