#pragma once

#include "style.h"
#include "cmpnnt.h"
#include "schain.h"

#if defined(TRACE_COMPLETE_CYCLES)
	extern BitTrace Complete_Cycles;
	#define SET_COMPLETE_CYCLES() Complete_Cycles.Set()
	#define CLEAR_COMPLETE_CYCLES() Complete_Cycles.Clear()
#else
	#define SET_COMPLETE_CYCLES()
	#define CLEAR_COMPLETE_CYCLES()
#endif

#if defined(TRACE_DEATH_ROW)
	extern BitTrace Death_Row;
	#define SET_DEATH_ROW() Death_Row.Set()
	#define CLEAR_DEATH_ROW() Death_Row.Clear()
#else
	#define SET_DEATH_ROW()
	#define CLEAR_DEATH_ROW()
#endif

//##########################################################################
//#######################    ApplicationTask    ############################
//##########################################################################

class ApplicationTask:
	public Component
{
public:
	ApplicationTask(ClassID class_ID = ApplicationTaskClassID);
	~ApplicationTask();
};

//##########################################################################
//#######################    BackgroundTasks    ############################
//##########################################################################

class BackgroundTasks:
	public Component
{
public:
	BackgroundTasks();
	~BackgroundTasks();

	Logical
		TestInstance() const;

	void
		AddTask(ApplicationTask *task);

	void
  	Execute();

private:
	SChainOf<ApplicationTask*>
		taskSocket;
	SChainIteratorOf<ApplicationTask*>
  	*taskIterator;
};

//~~~~~~~~~~~~~~~~~~~~~~~~~ NetworkManagerTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class NetworkManagerTask:
	public ApplicationTask
{
public:
	NetworkManagerTask() {}
	~NetworkManagerTask() {}

	void
		Execute();
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~~ RoutePacketTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class RoutePacketTask:
	public ApplicationTask
{
public:
	RoutePacketTask() {}
	~RoutePacketTask() {}

	void
		Execute();
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~ ProcessEventTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class ProcessEventTask:
	public ApplicationTask
{
public:
	ProcessEventTask() {}
	~ProcessEventTask() {}

	void
		Execute();
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~ AudioRendererTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class AudioRendererTask:
	public ApplicationTask
{
public:
	AudioRendererTask() {}
	~AudioRendererTask() {}

	void
		Execute();
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~ GaugeRendererTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class GaugeRendererTask:
	public ApplicationTask
{
public:
	GaugeRendererTask() {}
	~GaugeRendererTask() {}

	void
		Execute();
};

//~~~~~~~~~~~~~~~~~~~~~~~~~ CompleteCyclesTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class CompleteCyclesTask:
	public ApplicationTask
{
public:
	CompleteCyclesTask() {}
	~CompleteCyclesTask() {}

	void
		Execute();
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~~ FryDeathRowTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class FryDeathRowTask:
	public ApplicationTask
{
public:
	FryDeathRowTask() {}
	~FryDeathRowTask() {}

	void
		Execute();
};
