// Header file: DivisibleProblemQAI.hpp
// Description: Concept class: Divisible problem, query-action interface, iterative.
// Date: 2011-05-12 Khu

#ifndef DIVISIBLE_PROBLEM_QAI
#define DIVISIBLE_PROBLEM_QAI

#include "Problem.hpp"

	template <class S> class DivisibleProblemQAI : public Problem<S>
	{
		protected:
			bool is_directly_solvable;
			
			virtual void check_solvability () = 0;
			
			virtual void divide () = 0;
			// Precondition: !is_directly_solvable
			
			virtual void compute_solution ();
	};

	template <class S> void DivisibleProblemQAI<S>::compute_solution ()
	// Template method.
	{
		while (true)
		{
			check_solvability();
			if (is_directly_solvable) break;
			divide();
		}
	}
	
#endif // DIVISIBLE_PROBLEM_QAI
