mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-03-06 09:31:38 +00:00
- moved more stuff and split FRandom in two so that the high level baggage does not need to be pulled in to use the RNG.
This commit is contained in:
parent
fb1a7679ec
commit
9ef6b15bfa
14 changed files with 70 additions and 71 deletions
|
@ -1131,7 +1131,7 @@ set (PCH_SOURCES
|
||||||
common/utility/files_decompress.cpp
|
common/utility/files_decompress.cpp
|
||||||
utility/m_png.cpp
|
utility/m_png.cpp
|
||||||
utility/m_random.cpp
|
utility/m_random.cpp
|
||||||
utility/memarena.cpp
|
common/utility/memarena.cpp
|
||||||
utility/nodebuilder/nodebuild.cpp
|
utility/nodebuilder/nodebuild.cpp
|
||||||
utility/nodebuilder/nodebuild_classify_nosse2.cpp
|
utility/nodebuilder/nodebuild_classify_nosse2.cpp
|
||||||
utility/nodebuilder/nodebuild_events.cpp
|
utility/nodebuilder/nodebuild_events.cpp
|
||||||
|
@ -1142,11 +1142,11 @@ set (PCH_SOURCES
|
||||||
utility/stats.cpp
|
utility/stats.cpp
|
||||||
common/utility/cmdlib.cpp
|
common/utility/cmdlib.cpp
|
||||||
common/utility/configfile.cpp
|
common/utility/configfile.cpp
|
||||||
utility/i_time.cpp
|
common/utility/i_time.cpp
|
||||||
utility/m_argv.cpp
|
common/utility/m_argv.cpp
|
||||||
utility/m_bbox.cpp
|
utility/m_bbox.cpp
|
||||||
utility/name.cpp
|
utility/name.cpp
|
||||||
utility/s_playlist.cpp
|
common/utility/s_playlist.cpp
|
||||||
utility/v_collection.cpp
|
utility/v_collection.cpp
|
||||||
common/utility/zstrformat.cpp
|
common/utility/zstrformat.cpp
|
||||||
common/thirdparty/md5.cpp
|
common/thirdparty/md5.cpp
|
||||||
|
|
|
@ -160,7 +160,7 @@ void FMemArena::FreeAllBlocks()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void FMemArena::DumpInfo()
|
FString FMemArena::DumpInfo()
|
||||||
{
|
{
|
||||||
size_t allocated = 0;
|
size_t allocated = 0;
|
||||||
size_t used = 0;
|
size_t used = 0;
|
||||||
|
@ -169,7 +169,7 @@ void FMemArena::DumpInfo()
|
||||||
allocated += BlockSize;
|
allocated += BlockSize;
|
||||||
used += BlockSize - ((char*)block->Limit - (char*)block->Avail);
|
used += BlockSize - ((char*)block->Limit - (char*)block->Avail);
|
||||||
}
|
}
|
||||||
Printf("%zu bytes allocated, %zu bytes in use\n", allocated, used);
|
return FStringf("%zu bytes allocated, %zu bytes in use\n", allocated, used);
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
|
@ -46,7 +46,7 @@ public:
|
||||||
void *Alloc(size_t size);
|
void *Alloc(size_t size);
|
||||||
void FreeAll();
|
void FreeAll();
|
||||||
void FreeAllBlocks();
|
void FreeAllBlocks();
|
||||||
void DumpInfo();
|
FString DumpInfo();
|
||||||
void DumpData(FILE *f);
|
void DumpData(FILE *f);
|
||||||
|
|
||||||
protected:
|
protected:
|
|
@ -54,14 +54,12 @@ bool FPlayList::ChangeList (const char *path)
|
||||||
bool pls;
|
bool pls;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
Songs.Clear();
|
|
||||||
Position = 0;
|
|
||||||
|
|
||||||
if (!fr.OpenFile(path))
|
if (!fr.OpenFile(path))
|
||||||
{
|
{
|
||||||
Printf ("Could not open " TEXTCOLOR_BOLD "%s" TEXTCOLOR_NORMAL ": %s\n", path, strerror(errno));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Songs.Clear();
|
||||||
|
Position = 0;
|
||||||
|
|
||||||
first = true;
|
first = true;
|
||||||
pls = false;
|
pls = false;
|
||||||
|
@ -176,7 +174,6 @@ int FPlayList::SetPosition (int position)
|
||||||
{
|
{
|
||||||
Position = position;
|
Position = position;
|
||||||
}
|
}
|
||||||
DPrintf (DMSG_NOTIFY, "Playlist position set to %d\n", Position);
|
|
||||||
return Position;
|
return Position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +188,6 @@ int FPlayList::Advance ()
|
||||||
{
|
{
|
||||||
Position = 0;
|
Position = 0;
|
||||||
}
|
}
|
||||||
DPrintf (DMSG_NOTIFY, "Playlist advanced to song %d\n", Position);
|
|
||||||
return Position;
|
return Position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +197,6 @@ int FPlayList::Backup ()
|
||||||
{
|
{
|
||||||
Position = Songs.Size() - 1;
|
Position = Songs.Size() - 1;
|
||||||
}
|
}
|
||||||
DPrintf (DMSG_NOTIFY, "Playlist backed up to song %d\n", Position);
|
|
||||||
return Position;
|
return Position;
|
||||||
}
|
}
|
||||||
|
|
|
@ -730,13 +730,10 @@ UNSAFE_CCMD (playlist)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (PlayList.GetNumSongs() > 0)
|
if (!PlayList.ChangeList(argv[1]))
|
||||||
{
|
{
|
||||||
PlayList.ChangeList (argv[1]);
|
Printf("Could not open " TEXTCOLOR_BOLD "%s" TEXTCOLOR_NORMAL ": %s\n", argv[1], strerror(errno));
|
||||||
}
|
return;
|
||||||
else
|
|
||||||
{
|
|
||||||
PlayList.ChangeList(argv[1]);
|
|
||||||
}
|
}
|
||||||
if (PlayList.GetNumSongs () > 0)
|
if (PlayList.GetNumSongs () > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -148,7 +148,6 @@ FRandom::FRandom ()
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
Name = NULL;
|
Name = NULL;
|
||||||
initialized = false;
|
|
||||||
#endif
|
#endif
|
||||||
Next = RNGList;
|
Next = RNGList;
|
||||||
RNGList = this;
|
RNGList = this;
|
||||||
|
@ -167,7 +166,6 @@ FRandom::FRandom (const char *name)
|
||||||
{
|
{
|
||||||
NameCRC = CalcCRC32 ((const uint8_t *)name, (unsigned int)strlen (name));
|
NameCRC = CalcCRC32 ((const uint8_t *)name, (unsigned int)strlen (name));
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
initialized = false;
|
|
||||||
Name = name;
|
Name = name;
|
||||||
// A CRC of 0 is reserved for nameless RNGs that don't get stored
|
// A CRC of 0 is reserved for nameless RNGs that don't get stored
|
||||||
// in savegames. The chance is very low that you would get a CRC of 0,
|
// in savegames. The chance is very low that you would get a CRC of 0,
|
||||||
|
@ -258,8 +256,7 @@ void FRandom::Init(uint32_t seed)
|
||||||
// [RH] Use the RNG's name's CRC to modify the original seed.
|
// [RH] Use the RNG's name's CRC to modify the original seed.
|
||||||
// This way, new RNGs can be added later, and it doesn't matter
|
// This way, new RNGs can be added later, and it doesn't matter
|
||||||
// which order they get initialized in.
|
// which order they get initialized in.
|
||||||
uint32_t seeds[2] = { NameCRC, seed };
|
SFMTObj::Init(NameCRC, seed);
|
||||||
InitByArray(seeds, 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
|
@ -37,11 +37,11 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "basics.h"
|
#include "basics.h"
|
||||||
#include "sfmt/SFMT.h"
|
#include "SFMT/SFMTObj.h"
|
||||||
|
|
||||||
class FSerializer;
|
class FSerializer;
|
||||||
|
|
||||||
class FRandom
|
class FRandom : public SFMTObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FRandom ();
|
FRandom ();
|
||||||
|
@ -88,16 +88,6 @@ public:
|
||||||
|
|
||||||
void Init(uint32_t seed);
|
void Init(uint32_t seed);
|
||||||
|
|
||||||
// SFMT interface
|
|
||||||
unsigned int GenRand32();
|
|
||||||
uint64_t GenRand64();
|
|
||||||
void FillArray32(uint32_t *array, int size);
|
|
||||||
void FillArray64(uint64_t *array, int size);
|
|
||||||
void InitGenRand(uint32_t seed);
|
|
||||||
void InitByArray(uint32_t *init_key, int key_length);
|
|
||||||
int GetMinArraySize32();
|
|
||||||
int GetMinArraySize64();
|
|
||||||
|
|
||||||
/* These real versions are due to Isaku Wada */
|
/* These real versions are due to Isaku Wada */
|
||||||
/** generates a random number on [0,1]-real-interval */
|
/** generates a random number on [0,1]-real-interval */
|
||||||
static inline double ToReal1(uint32_t v)
|
static inline double ToReal1(uint32_t v)
|
||||||
|
@ -190,29 +180,6 @@ private:
|
||||||
uint32_t NameCRC;
|
uint32_t NameCRC;
|
||||||
|
|
||||||
static FRandom *RNGList;
|
static FRandom *RNGList;
|
||||||
|
|
||||||
/*-------------------------------------------
|
|
||||||
SFMT internal state, index counter and flag
|
|
||||||
-------------------------------------------*/
|
|
||||||
|
|
||||||
void GenRandAll();
|
|
||||||
void GenRandArray(w128_t *array, int size);
|
|
||||||
void PeriodCertification();
|
|
||||||
|
|
||||||
/** the 128-bit internal state array */
|
|
||||||
union
|
|
||||||
{
|
|
||||||
w128_t w128[SFMT::N];
|
|
||||||
unsigned int u[SFMT::N32];
|
|
||||||
uint64_t u64[SFMT::N64];
|
|
||||||
} sfmt;
|
|
||||||
/** index counter to the 32-bit internal state array */
|
|
||||||
int idx;
|
|
||||||
/** a flag: it is 0 if and only if the internal state is not yet
|
|
||||||
* initialized. */
|
|
||||||
#ifndef NDEBUG
|
|
||||||
bool initialized;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern uint32_t rngseed; // The starting seed (not part of state)
|
extern uint32_t rngseed; // The starting seed (not part of state)
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
*/
|
*/
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "m_random.h"
|
#include "SFMT/SFMTObj.h"
|
||||||
#include "SFMT-params.h"
|
#include "SFMT-params.h"
|
||||||
|
|
||||||
#if defined(__BIG_ENDIAN__) && !defined(__amd64) && !defined(BIG_ENDIAN64)
|
#if defined(__BIG_ENDIAN__) && !defined(__amd64) && !defined(BIG_ENDIAN64)
|
||||||
|
@ -201,7 +201,7 @@ inline static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c,
|
||||||
* This function fills the internal state array with pseudorandom
|
* This function fills the internal state array with pseudorandom
|
||||||
* integers.
|
* integers.
|
||||||
*/
|
*/
|
||||||
void FRandom::GenRandAll()
|
void SFMTObj::GenRandAll()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
w128_t *r1, *r2;
|
w128_t *r1, *r2;
|
||||||
|
@ -227,7 +227,7 @@ void FRandom::GenRandAll()
|
||||||
* @param array an 128-bit array to be filled by pseudorandom numbers.
|
* @param array an 128-bit array to be filled by pseudorandom numbers.
|
||||||
* @param size number of 128-bit pseudorandom numbers to be generated.
|
* @param size number of 128-bit pseudorandom numbers to be generated.
|
||||||
*/
|
*/
|
||||||
void FRandom::GenRandArray(w128_t *array, int size)
|
void SFMTObj::GenRandArray(w128_t *array, int size)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
w128_t *r1, *r2;
|
w128_t *r1, *r2;
|
||||||
|
@ -301,7 +301,7 @@ static uint32_t func2(uint32_t x)
|
||||||
/**
|
/**
|
||||||
* This function certificate the period of 2^{MEXP}
|
* This function certificate the period of 2^{MEXP}
|
||||||
*/
|
*/
|
||||||
void FRandom::PeriodCertification()
|
void SFMTObj::PeriodCertification()
|
||||||
{
|
{
|
||||||
int inner = 0;
|
int inner = 0;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
@ -337,7 +337,7 @@ PUBLIC FUNCTIONS
|
||||||
* fill_array32() function.
|
* fill_array32() function.
|
||||||
* @return minimum size of array used for FillArray32() function.
|
* @return minimum size of array used for FillArray32() function.
|
||||||
*/
|
*/
|
||||||
int FRandom::GetMinArraySize32()
|
int SFMTObj::GetMinArraySize32()
|
||||||
{
|
{
|
||||||
return SFMT::N32;
|
return SFMT::N32;
|
||||||
}
|
}
|
||||||
|
@ -347,7 +347,7 @@ int FRandom::GetMinArraySize32()
|
||||||
* fill_array64() function.
|
* fill_array64() function.
|
||||||
* @return minimum size of array used for FillArray64() function.
|
* @return minimum size of array used for FillArray64() function.
|
||||||
*/
|
*/
|
||||||
int FRandom::GetMinArraySize64()
|
int SFMTObj::GetMinArraySize64()
|
||||||
{
|
{
|
||||||
return SFMT::N64;
|
return SFMT::N64;
|
||||||
}
|
}
|
||||||
|
@ -358,7 +358,7 @@ int FRandom::GetMinArraySize64()
|
||||||
* init_gen_rand or init_by_array must be called before this function.
|
* init_gen_rand or init_by_array must be called before this function.
|
||||||
* @return 32-bit pseudorandom number
|
* @return 32-bit pseudorandom number
|
||||||
*/
|
*/
|
||||||
unsigned int FRandom::GenRand32()
|
unsigned int SFMTObj::GenRand32()
|
||||||
{
|
{
|
||||||
uint32_t r;
|
uint32_t r;
|
||||||
|
|
||||||
|
@ -379,7 +379,7 @@ unsigned int FRandom::GenRand32()
|
||||||
* unless an initialization is again executed.
|
* unless an initialization is again executed.
|
||||||
* @return 64-bit pseudorandom number
|
* @return 64-bit pseudorandom number
|
||||||
*/
|
*/
|
||||||
uint64_t FRandom::GenRand64()
|
uint64_t SFMTObj::GenRand64()
|
||||||
{
|
{
|
||||||
#if defined(BIG_ENDIAN64) && !defined(ONLY64)
|
#if defined(BIG_ENDIAN64) && !defined(ONLY64)
|
||||||
uint32_t r1, r2;
|
uint32_t r1, r2;
|
||||||
|
@ -433,7 +433,7 @@ uint64_t FRandom::GenRand64()
|
||||||
* memory. Mac OSX doesn't have these functions, but \b malloc of OSX
|
* memory. Mac OSX doesn't have these functions, but \b malloc of OSX
|
||||||
* returns the pointer to the aligned memory block.
|
* returns the pointer to the aligned memory block.
|
||||||
*/
|
*/
|
||||||
void FRandom::FillArray32(uint32_t *array, int size)
|
void SFMTObj::FillArray32(uint32_t *array, int size)
|
||||||
{
|
{
|
||||||
assert(initialized);
|
assert(initialized);
|
||||||
assert(idx == SFMT::N32);
|
assert(idx == SFMT::N32);
|
||||||
|
@ -470,7 +470,7 @@ void FRandom::FillArray32(uint32_t *array, int size)
|
||||||
* memory. Mac OSX doesn't have these functions, but \b malloc of OSX
|
* memory. Mac OSX doesn't have these functions, but \b malloc of OSX
|
||||||
* returns the pointer to the aligned memory block.
|
* returns the pointer to the aligned memory block.
|
||||||
*/
|
*/
|
||||||
void FRandom::FillArray64(uint64_t *array, int size)
|
void SFMTObj::FillArray64(uint64_t *array, int size)
|
||||||
{
|
{
|
||||||
assert(initialized);
|
assert(initialized);
|
||||||
assert(idx == SFMT::N32);
|
assert(idx == SFMT::N32);
|
||||||
|
@ -491,7 +491,7 @@ void FRandom::FillArray64(uint64_t *array, int size)
|
||||||
*
|
*
|
||||||
* @param seed a 32-bit integer used as the seed.
|
* @param seed a 32-bit integer used as the seed.
|
||||||
*/
|
*/
|
||||||
void FRandom::InitGenRand(uint32_t seed)
|
void SFMTObj::InitGenRand(uint32_t seed)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -515,7 +515,7 @@ void FRandom::InitGenRand(uint32_t seed)
|
||||||
* @param init_key the array of 32-bit integers, used as a seed.
|
* @param init_key the array of 32-bit integers, used as a seed.
|
||||||
* @param key_length the length of init_key.
|
* @param key_length the length of init_key.
|
||||||
*/
|
*/
|
||||||
void FRandom::InitByArray(uint32_t *init_key, int key_length)
|
void SFMTObj::InitByArray(uint32_t *init_key, int key_length)
|
||||||
{
|
{
|
||||||
int i, j, count;
|
int i, j, count;
|
||||||
uint32_t r;
|
uint32_t r;
|
||||||
|
|
43
src/utility/sfmt/SFMTObj.h
Normal file
43
src/utility/sfmt/SFMTObj.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "SFMT.h"
|
||||||
|
|
||||||
|
struct SFMTObj
|
||||||
|
{
|
||||||
|
void Init(uint32_t seed1, uint32_t seed2)
|
||||||
|
{
|
||||||
|
uint32_t seeds[2] = { seed1, seed2 };
|
||||||
|
InitByArray(seeds, 2);
|
||||||
|
}
|
||||||
|
void GenRandAll();
|
||||||
|
void GenRandArray(w128_t *array, int size);
|
||||||
|
void PeriodCertification();
|
||||||
|
int GetMinArraySize32();
|
||||||
|
int GetMinArraySize64();
|
||||||
|
unsigned int GenRand32();
|
||||||
|
uint64_t GenRand64();
|
||||||
|
void FillArray32(uint32_t *array, int size);
|
||||||
|
void FillArray64(uint64_t *array, int size);
|
||||||
|
void InitGenRand(uint32_t seed);
|
||||||
|
void InitByArray(uint32_t *init_key, int key_length);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/** index counter to the 32-bit internal state array */
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
/** the 128-bit internal state array */
|
||||||
|
union
|
||||||
|
{
|
||||||
|
w128_t w128[SFMT::N];
|
||||||
|
unsigned int u[SFMT::N32];
|
||||||
|
uint64_t u64[SFMT::N64];
|
||||||
|
} sfmt;
|
||||||
|
|
||||||
|
/** a flag: it is 0 if and only if the internal state is not yet
|
||||||
|
* initialized. */
|
||||||
|
#ifndef NDEBUG
|
||||||
|
bool initialized = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
};
|
Loading…
Reference in a new issue