////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// File: "criticalSelection.h"
// Author: Scott Smallback (SS)
// Purpose: Handles the selection of the magnet gun
// 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#pragma once
#include <vector>

class criticalSectionControl
{
protected:
	struct criticalSection
	{
		volatile bool locked;
		bool active;
	};

	std::vector<criticalSection*> criticals;

	//Singleton protection
	criticalSectionControl();
	criticalSectionControl(const criticalSectionControl&);
	criticalSectionControl& operator=(const criticalSectionControl&);
	~criticalSectionControl();
public:
	static criticalSectionControl* getInstance();

	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//	Function:		"getCriticalSelection"
	//	Last Modified:	September 22, 2008
	//	Purpose:		returns the value of the selected object
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	unsigned int getCriticalSection();
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//	Function:		"releaseCriticalSelection"
	//	Last Modified:	September 22, 2008
	//	Purpose:		releases selected object
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	void releaseCriticalSection(unsigned int id);

	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//	Function:		"lockSection"
	//	Last Modified:	September 22, 2008
	//	Purpose:		When clicked,  it locks the object to the magnet gun
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	void lockSection(unsigned int id);
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//	Function:		"unlockSelection"
	//	Last Modified:	September 22, 2008
	//	Purpose:		when mouse is released it will unlock the object from the gun
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	void unlockSection(unsigned int id);

	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//	Function:		"isLocked"
	//	Last Modified:	September 22, 2008
	//	Purpose:		checks to see if the object is locked
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	bool isLocked(unsigned int id);

	//////////////////////////////////////////////////////////////////////////////////////////////////////
	//	Function:		"waitForUnlock"
	//	Last Modified:	September 22, 2008
	//	Purpose:		waits for the unlocking of the object
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	void waitForUnlock(unsigned int id);
};