/*Header file of the PStep_SeparationManager class

This file also includes derived classes of PStep_SeparationManager.

Implementation of PStep_SeparationManagerX can be found in PStep_SeparationManagerX.cpp.

This class represents a separation algorithm.

*/

#ifndef _PSTEP_PSTEPSEPARATIONMANAGER_H
#define _PSTEP_PSTEPSEPARATIONMANAGER_H

#include "PStep_SeparationAlgorithm.h"

//Class used to represent a separation manager.
class PStep_SeparationManager{

protected:
	//Algorithm members
	PStep_AlgorithmMembers& AlgorithmMembers;

	//List of PStep_SeperationAlgorithm0s
	std::list<PStep_SeparationAlgorithm0> ListOfSeperationAlgorithm0s;
	//List of PStep_SeperationAlgorithm1s
	std::list<PStep_SeparationAlgorithm1> ListOfSeperationAlgorithm1s;
	//List of PStep_SeperationAlgorithm2s
	std::list<PStep_SeparationAlgorithm2> ListOfSeperationAlgorithm2s;
	//List of PStep_SeperationAlgorithm3s
	std::list<PStep_SeparationAlgorithm3> ListOfSeperationAlgorithm3s;
	//List of PStep_SeperationAlgorithm4s
	std::list<PStep_SeparationAlgorithm4> ListOfSeperationAlgorithm4s;
	//List of PStep_SeperationAlgorithm5s
	std::list<PStep_SeparationAlgorithm5> ListOfSeperationAlgorithm5s;
	//List of PStep_SeperationAlgorithm6s
	std::list<PStep_SeparationAlgorithm6> ListOfSeperationAlgorithm6s;
	//List of PStep_SeperationAlgorithm7s
	std::list<PStep_SeparationAlgorithm7> ListOfSeperationAlgorithm7s;
	//List of PStep_SeperationAlgorithm9s
	std::list<PStep_SeparationAlgorithm9> ListOfSeperationAlgorithm9s;
	
	//(Reference to) Pointer to selected PStep_SeparationAlgorithm
	PStep_SeparationAlgorithm* &CurrentSeparationAlgorithm;

public:
	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm)
		: AlgorithmMembers(InitAlgorithmMembers), CurrentSeparationAlgorithm(InitCurrentSeparationAlgorithm)
	{};

	//Manage
	//------------------------------------------------------------------------------------

	//Manage
	virtual void Manage() = 0;

};

//Class used to represent the separation manager with separation strategy 0.
class PStep_SeparationManager0 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager0(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm0
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 1.
class PStep_SeparationManager1 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager1(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm1
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 2.
class PStep_SeparationManager2 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager2(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm2
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 3.
class PStep_SeparationManager3 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager3(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm3
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 4.
class PStep_SeparationManager4 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager4(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm4
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 5.
class PStep_SeparationManager5 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager5(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm5
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 6.
class PStep_SeparationManager6 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager6(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm6
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 7.
class PStep_SeparationManager7 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager7(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm7
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 8.
class PStep_SeparationManager8 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager8(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm7 in the rootnode and SeparationAlgorithm1 in all other nodes.
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 9.
class PStep_SeparationManager9 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager9(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm9
	virtual void Manage();

};

//Class used to represent the separation manager with separation strategy 10.
class PStep_SeparationManager10 : public PStep_SeparationManager{
public:

	//Constructor functions
	//------------------------------------------------------------------------------------

	//Basic constructor
	PStep_SeparationManager10(PStep_AlgorithmMembers& InitAlgorithmMembers, PStep_SeparationAlgorithm* &InitCurrentSeparationAlgorithm);

	//Manage
	//------------------------------------------------------------------------------------

	//Set current separator to SeperationAlgorithm7 in the rootnode and SeparationAlgorithm1 in all other nodes.
	virtual void Manage();

};

#endif