/*
*	DSFML - SFML Library wrapper for the D programming language.
*	Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com)
*	Copyright (C) 2010 Andreas Hollandt
*
*	This software is provided 'as-is', without any express or
*	implied warranty. In no event will the authors be held
*	liable for any damages arising from the use of this software.
*
*	Permission is granted to anyone to use this software for any purpose,
*	including commercial applications, and to alter it and redistribute
*	it freely, subject to the following restrictions:
*
*	1.  The origin of this software must not be misrepresented;
*		you must not claim that you wrote the original software.
*		If you use this software in a product, an acknowledgment
*		in the product documentation would be appreciated but
*		is not required.
*
*	2.  Altered source versions must be plainly marked as such,
*		and must not be misrepresented as being the original software.
*
*	3.  This notice may not be removed or altered from any
*		source distribution.
*/

module dsfml.system.randomizer;

import dsfml.system.common;

/**
*	Randomizer is an utility class for generating pseudo-random
*	numbers
*	
*	Examples:
*	-----------------------------------------------------------
*	int randI = Randomizer.Random(1, 100);
*	float randF = Randomizer.Random(1.0, 10.0)
*	-----------------------------------------------------------
*/
class Randomizer
{
	/**
	*	Set the seed for the generator. Using a known seed
	*	allows you to reproduce the same sequence of random number
	*
	*	Params:
	*		seed = Number to use as the seed
	*
	*/
	static void setSeed(uint seed)
	{
		sfRandom_SetSeed(seed);
	}

	/**
	*	Get the seed used to generate random numbers the generator.
	*
	*	Returns:
	*		Current seed
	*/
	static uint getSeed()
	{
		return sfRandom_GetSeed();
	}
	
	/**
	*	Get a random float number in a given range
	*
	*	Params:
	*		begin = Start of the range
	*		end = End of the range
	*	Returns:
	*		Random number in [Begin, End]								
	*/
	static float random(float begin, float end)
	{
		return sfRandom_Float(begin, end);
	}
	
	/**
	*	Get a random integral number in a given range
	*
	*	Params:
	*		begin = Start of the range
	*		end = End of the range
	*	Returns:
	*		Random number in [Begin, End]								
	*/
	static int random(int begin, int end)
	{
		return sfRandom_Int(begin, end);
	}


private:

	/*
	*	Prevent instanciation
	*/
	this()
	{
		
	}

// External ====================================================================

	extern (C)
	{
		typedef void function(uint) pf_sfRandom_SetSeed;
		typedef uint function() pf_sfRandom_GetSeed;
		typedef float function(float, float) pf_sfRandom_Float;
		typedef int function(int, int) pf_sfRandom_Int;
		
		static pf_sfRandom_SetSeed sfRandom_SetSeed;
		static pf_sfRandom_GetSeed sfRandom_GetSeed;
		static pf_sfRandom_Float sfRandom_Float;
		static pf_sfRandom_Int sfRandom_Int;
	}

	static this()
	{
	debug
		DllLoader dll = DllLoader.load("csfml-system-d");
	else
		DllLoader dll = DllLoader.load("csfml-system");
		
		sfRandom_SetSeed = cast(pf_sfRandom_SetSeed)dll.getSymbol("sfRandom_SetSeed");
		sfRandom_GetSeed = cast(pf_sfRandom_GetSeed)dll.getSymbol("sfRandom_GetSeed");
		sfRandom_Float = cast(pf_sfRandom_Float)dll.getSymbol("sfRandom_Float");
		sfRandom_Int = cast(pf_sfRandom_Int)dll.getSymbol("sfRandom_Int");
	}
}