// file:          SearchspaceFactory.hpp
// description:   Class with a static factory function for searchspace objects.
// author:        Karlheinz Hug
// creation date: 2012-07-05
// last update:   2012-07-05

#ifndef SEARCHSPACE_FACTORY_HPP_
#define SEARCHSPACE_FACTORY_HPP_

#include <cassert>

#include "LinearSearcharray.hpp"
#include "FastLinearSearcharray.hpp"
#include "BinarySearcharray.hpp"
#include "FastBinarySearcharray.hpp"
#include "LinearSearchlist.hpp"
#include "FastLinearSearchlist.hpp"
#include "BinarySearchtree.hpp"

	template <typename T>
	class SearchspaceFactory
		// Instantiation condition: T is a comparable type.
	{
		public:
			static SearchspaceGeneral<T> * new_searchspace
				(unsigned int size, T min_item, T max_item, char space_type);
				// Factory function for a searchspace described by space_type.
				// Caution! Function with a side-effect! Do not use in assertions!
				// PÜ 31.3(3).
				// precondition: min_item <= max_item
	}; // SearchspaceFactory

	template <typename T>
	SearchspaceGeneral<T> * SearchspaceFactory<T>::new_searchspace
		(unsigned int size, T min_item, T max_item, char space_type)
	{
		assert(min_item <= max_item); // precondition
		SearchspaceGeneral<T> * result;
		switch (space_type)
		{
			case 'l' : result = new LinearSearcharray<T>();     break;
			case 'L' : result = new FastLinearSearcharray<T>(); break;
			case 'b' : result = new BinarySearcharray<T>();     break;
			case 'B' :
			default  : result = new FastBinarySearcharray<T>(); break;
			case 's' : result = new LinearSearchlist<T>();      break;
			case 'S' : result = new FastLinearSearchlist<T>();  break;
			case 't' : result = new BinarySearchtree<T>();      break;
		}
		result->fill(size, min_item, max_item);
		return result;
	}

#endif // SEARCHSPACE_FACTORY_HPP_
