/*******************************************************************************
 * Copyright (c) 2016 CEA LIST.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Created on: 29 févr. 2012
 *
 * Contributors:
 *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
 *   - Initial API and implementation
 ******************************************************************************/

#ifndef SOLVER_SOLVERDEF_H_
#define SOLVER_SOLVERDEF_H_


/**
 * DEFINE MACRO W.R.T. LICENSE CONSTRAINT
 */
#if defined( _ECLIPSE_PUBLIC_LICENSE_ )


//// Default
//#define _AVM_SOLVER_CVC4_
//
//// Incubation
//#define _AVM_SOLVER_Z3_

// Experimental
#if defined( _AVM_SOLVER_YICES_V2_ )
	#undef _AVM_SOLVER_YICES_V2_
#endif /* _AVM_SOLVER_YICES_V2_ */

// Deprecated
#if defined( _AVM_SOLVER_OMEGA_ )
	#undef _AVM_SOLVER_OMEGA_
#endif /* _AVM_SOLVER_OMEGA_ */


#else


//// Default
//#if not defined( _AVM_SOLVER_CVC4_ )
//#define _AVM_SOLVER_CVC4_
//#endif /* _AVM_SOLVER_CVC4_ */
//
//// Incubation
//#if not defined( _AVM_SOLVER_Z3_ )
//#define _AVM_SOLVER_Z3_
//#endif /* _AVM_SOLVER_Z3_ */
//
//// Experimental
//#if not defined( _AVM_SOLVER_YICES_V2_ )
//#define _AVM_SOLVER_YICES_V2_
//#endif /* _AVM_SOLVER_YICES_V2_ */
//
//
//// Deprecated
//#if not defined( _AVM_SOLVER_OMEGA_ )
//#define _AVM_SOLVER_OMEGA_
//#endif /* _AVM_SOLVER_OMEGA_ */


#endif /* _ECLIPSE_PUBLIC_LICENSE_ */


#include <string>

//#if defined( _AVM_SOLVER_OMEGA_ )
//
//#endif /* _AVM_SOLVER_OMEGA_ */


//#if defined( _AVM_SOLVER_CVC4_ )
//
//#elif defined( _AVM_SOLVER_CVC3_ )
//
//#endif /* _AVM_SOLVER_CVC_ */
//
//
//#if defined( _AVM_SOLVER_YICES_V2_ )
//
//#elif defined( _AVM_SOLVER_YICES_V1_ )
//
//#endif /* _AVM_SOLVER_YICES_ */
//
//
//#if defined( _AVM_SOLVER_Z3_ )
//
//#endif /* _AVM_SOLVER_Z3_ */


namespace sep
{


class OutStream;


class SolverDef
{

public:
	/**
	 * TYPE DECLARATIONS
	 */

	enum SATISFIABILITY_RING {
		UNSATISFIABLE = 0,
		SATISFIABLE = 1,

		ABORT_SAT,
		UNKNOWN_SAT
	};


	enum VALIDITY_RING {
		INVALID = 0,
		VALID = 1,

		ABORT_VALID,
		UNKNOWN_VALID
	};


	/**
	 * TYPE DECLARATIONS
	 */
	enum SOLVER_KIND
	{
		SOLVER_UNDEFINED_KIND   = 0x0000,

		SOLVER_OMEGA_KIND       = 0x00001,

		SOLVER_YICES1_KIND      = 0x00010,
		SOLVER_YICES2_KIND      = 0x00020,

		SOLVER_YICES_KIND       = SOLVER_YICES1_KIND
	                            | SOLVER_YICES2_KIND,

		SOLVER_Z3_KIND          = 0x00100,

		SOLVER_CVC3_KIND        = 0x01000,
		SOLVER_CVC3_BV32_KIND   = 0x02000,

		SOLVER_CVC4_KIND        = 0x04000,
		SOLVER_CVC4_BV32_KIND   = 0x08000,

		SOLVER_CVC_KIND         = SOLVER_CVC3_KIND
	                            | SOLVER_CVC4_KIND,

		SOLVER_CVC_BV_KIND      = SOLVER_CVC3_BV32_KIND
								| SOLVER_CVC4_BV32_KIND
	};


public:
	/**
	* CONSTRUCTOR
	* Default
	*/
	SolverDef()
	{
		//!! NOTHING
	}


	/**
	* DESTRUCTOR
	*/
	virtual ~SolverDef()
	{
		//!! NOTHING
	}

	/**
	 * ATTRIBUTES
	 */
	static bool DEFAULT_SOLVER_USAGE_FLAG;

	static SolverDef::SOLVER_KIND DEFAULT_SOLVER_KIND;


	/**
	 * toString
	 */
	static std::string strSatisfiability(SATISFIABILITY_RING ring);

	static std::string strValidity(VALIDITY_RING ring);

	static std::string strSolver(SOLVER_KIND king);

	/**
	 * toSolver
	 */
	static SOLVER_KIND toSolver(std::string strKing,
			SOLVER_KIND defaultKind /*= SOLVER_UNDEFINED_KIND*/);

	/**
	 * SOLVER
	 * Available
	 * List
	 */
	static bool isAvailableSolver(SOLVER_KIND king);

	static void toStreamSolverList(OutStream & os,
			const std::string & aHeader = "solvers");


};

} /* namespace sep */
#endif /* SOLVER_SOLVERDEF_H_ */
