15 #ifndef ROOT_Math_GSLRngROOTWrapper
16 #define ROOT_Math_GSLRngROOTWrapper
18 #include "gsl/gsl_rng.h"
37 template <
class Engine>
38 struct GSLRngROOTWrapper {
40 Engine *fEngine =
nullptr;
45 static void CreateEngine(gsl_rng *r)
48 GSLRngROOTWrapper *wrng = ((GSLRngROOTWrapper *)r->state);
51 wrng->fEngine =
new Engine();
55 static double Rndm(
void *p) {
return ((GSLRngROOTWrapper *)p)->fEngine->operator()(); }
56 static unsigned long IntRndm(
void *p) {
return ((GSLRngROOTWrapper *)p)->fEngine->IntRndm(); }
58 static void Seed(
void *p,
unsigned long seed)
60 auto wrng = ((GSLRngROOTWrapper *)p);
63 if (seed == gsl_rng_default_seed) {
65 if (!wrng->fEngine) wrng->fEngine =
new Engine();
67 assert(wrng->fEngine !=
nullptr);
68 wrng->fEngine->SetSeed(seed);
70 static void FreeEngine(gsl_rng *r)
72 auto wrng = ((GSLRngROOTWrapper *)r->state);
75 wrng->fEngine =
nullptr;
78 static unsigned long Max() {
return Engine::MaxInt(); }
79 static unsigned long Min() {
return Engine::MinInt(); }
80 static size_t Size() {
return sizeof(GSLRngROOTWrapper<Engine>); }
81 static std::string Name() {
return std::string(
"GSL_") + Engine::Name(); }
91 typedef ROOT::Math::GSLRngROOTWrapper<ROOT::Math::MixMaxEngine<17,0>> GSLMixMaxWrapper;
93 static const std::string gsl_mixmax_name = GSLMixMaxWrapper::Name();
94 static const gsl_rng_type mixmax_type =
96 gsl_mixmax_name.c_str(),
97 GSLMixMaxWrapper::Max(),
98 GSLMixMaxWrapper::Min(),
99 GSLMixMaxWrapper::Size(),
100 &GSLMixMaxWrapper::Seed,
101 &GSLMixMaxWrapper::IntRndm,
102 &GSLMixMaxWrapper::Rndm
105 const gsl_rng_type *gsl_rng_mixmax = &mixmax_type;