#pragma once

#include "Betriebssystem.h"

namespace Framework
{
    class Datei;

    class RandomGenerator
    {
    private:
        struct random_data
        {
            int *fptr;		/* Front pointer.  */
            int *rptr;		/* Rear pointer.  */
            int *state;		/* Array of state values.  */
            int rand_type;		/* Type of random number generator.  */
            int rand_deg;		/* Degree of random number generator.  */
            int rand_sep;		/* Distance between front and rear.  */
            int *end_ptr;		/* Pointer behind state table.  */
        };

        int randtbl[ 32 ];
        random_data unsafe_state;
        int seed;
        int offset;
        int ref;

        void srand( int seed );

    public:
        // Konstruktor
        // Erzeugt einen neuen Zufallsgenerator mit dem seed des Zeitpunktes des Erzeugens
        __declspec( dllexport ) RandomGenerator();
        // Destruktor
        __declspec( dllexport ) ~RandomGenerator();
        // Gibt eine Zufallszahl zwischen 0 und 1 zur�ck
        __declspec( dllexport ) double rand();
        // Initialisiert den Gennerator mit einem Seed.
        // Diese methode sollte m�glichst nur mit seeds verwendet werden, die von getSeed zur�ckgegeben wurden, da der aufruf sonnst sehr lange dauern kann
        __declspec( dllexport ) void setSeed( __int64 seed );
        // Gibt den aktuellen Seed zur�ck, mit dem alle weiteren Zufallszahlen vorherbestimmt werden k�nnen
        __declspec( dllexport ) __int64 getSeed() const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) RandomGenerator *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Objekt automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) RandomGenerator *release();
    };
}