commit 179d474e4484fda313cd385dce77843775a706b3
parent 4cd944558355e2906b109aa34c6ccf16f32bd6ee
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 27 Oct 2015 16:19:29 +0100
Add and test the ssp_rng_[proxy_]_get_type functions
Retrieve the type used by the [proxy] RNG. Add the ssp_rng_type_eq
inline function that test if 2 types are equals.
Diffstat:
5 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/src/ssp.h b/src/ssp.h
@@ -81,6 +81,26 @@ struct ssp_rng_type {
size_t sizeof_state;
};
+static FINLINE char
+ssp_rng_type_eq(const struct ssp_rng_type* t0, const struct ssp_rng_type* t1)
+{
+ ASSERT(t0 && t1);
+ return t0->init == t1->init
+ && t0->release == t1->release
+ && t0->set == t1->set
+ && t0->get == t1->get
+ && t0->discard == t1->discard
+ && t0->uniform_uint64 == t1->uniform_uint64
+ && t0->uniform_double == t1->uniform_double
+ && t0->canonical == t1->canonical
+ && t0->read == t1->read
+ && t0->write == t1->write
+ && t0->entropy == t1->entropy
+ && t0->min == t1->min
+ && t0->max == t1->max
+ && t0->sizeof_state == t1->sizeof_state;
+}
+
BEGIN_DECLS
/* David Jones's Keep It Simple Stupid builtin PRNG type. Suitable for fast
@@ -122,6 +142,11 @@ ssp_rng_ref_get
(struct ssp_rng* rng);
SSP_API res_T
+ssp_rng_get_type
+ (struct ssp_rng* rng,
+ struct ssp_rng_type* type);
+
+SSP_API res_T
ssp_rng_set
(struct ssp_rng* rng,
const uint64_t seed);
@@ -205,6 +230,11 @@ ssp_rng_proxy_create_rng
const size_t ibucket,
struct ssp_rng** rng);
+SSP_API res_T
+ssp_rng_proxy_get_type
+ (struct ssp_rng_proxy* proxy,
+ struct ssp_rng_type* type);
+
/*******************************************************************************
* Miscellaneous distributions
******************************************************************************/
diff --git a/src/ssp_rng.c b/src/ssp_rng.c
@@ -585,6 +585,14 @@ ssp_rng_ref_put(struct ssp_rng* rng)
return RES_OK;
}
+res_T
+ssp_rng_get_type(struct ssp_rng* rng, struct ssp_rng_type* type)
+{
+ if(!rng || !type) return RES_BAD_ARG;
+ *type = rng->type;
+ return RES_OK;
+}
+
uint64_t
ssp_rng_get(struct ssp_rng* rng)
{
diff --git a/src/ssp_rng_proxy.c b/src/ssp_rng_proxy.c
@@ -496,3 +496,12 @@ error:
goto exit;
}
+res_T
+ssp_rng_proxy_get_type
+ (struct ssp_rng_proxy* proxy,
+ struct ssp_rng_type* type)
+{
+ if(!proxy || !type) return RES_BAD_ARG;
+ *type = proxy->type;
+ return RES_OK;
+}
diff --git a/src/test_ssp_rng.c b/src/test_ssp_rng.c
@@ -41,6 +41,7 @@ static void /* Really basic test */
test_rng(const struct ssp_rng_type* type)
{
FILE* stream;
+ struct ssp_rng_type type2;
struct ssp_rng* rng = NULL;
struct ssp_rng* rng1 = NULL;
struct ssp_rng* rng2 = NULL;
@@ -77,6 +78,12 @@ test_rng(const struct ssp_rng_type* type)
#endif
CHECK(r, RES_OK);
+ CHECK(ssp_rng_get_type(NULL, NULL), RES_BAD_ARG);
+ CHECK(ssp_rng_get_type(rng, NULL), RES_BAD_ARG);
+ CHECK(ssp_rng_get_type(NULL, &type2), RES_BAD_ARG);
+ CHECK(ssp_rng_get_type(rng, &type2), RES_OK);
+ CHECK(ssp_rng_type_eq(type, &type2), 1);
+
CHECK(ssp_rng_ref_get(NULL), RES_BAD_ARG);
CHECK(ssp_rng_ref_get(rng), RES_OK);
CHECK(ssp_rng_ref_put(NULL), RES_BAD_ARG);
diff --git a/src/test_ssp_rng_proxy.c b/src/test_ssp_rng_proxy.c
@@ -34,6 +34,7 @@
int
main(int argc, char** argv)
{
+ struct ssp_rng_type type;
struct ssp_rng_proxy* proxy;
struct ssp_rng_proxy* proxy1, *proxy2;
struct ssp_rng* rng[4];
@@ -54,6 +55,13 @@ main(int argc, char** argv)
CHECK(ssp_rng_proxy_create(NULL, NULL, 4, &proxy), RES_BAD_ARG);
CHECK(ssp_rng_proxy_create(NULL, &ssp_rng_mt19937_64, 4, &proxy), RES_OK);
+ CHECK(ssp_rng_proxy_get_type(NULL, NULL), RES_BAD_ARG);
+ CHECK(ssp_rng_proxy_get_type(proxy, NULL), RES_BAD_ARG);
+ CHECK(ssp_rng_proxy_get_type(NULL, &type), RES_BAD_ARG);
+ CHECK(ssp_rng_proxy_get_type(proxy, &type), RES_OK);
+
+ CHECK(ssp_rng_type_eq(&type, &ssp_rng_kiss), 0);
+ CHECK(ssp_rng_type_eq(&type, &ssp_rng_mt19937_64), 1);
CHECK(ssp_rng_proxy_ref_get(NULL), RES_BAD_ARG);
CHECK(ssp_rng_proxy_ref_get(proxy), RES_OK);
@@ -75,6 +83,13 @@ main(int argc, char** argv)
}
CHECK(ssp_rng_proxy_ref_put(proxy), RES_OK);
+ CHECK(ssp_rng_get_type(rng[0], &type), RES_OK);
+ FOR_EACH(i, 1, 4) {
+ struct ssp_rng_type type2;
+ CHECK(ssp_rng_get_type(rng[i], &type2), RES_OK);
+ CHECK(ssp_rng_type_eq(&type, &type2), 1);
+ }
+
FOR_EACH(i, 0, 2000000) {
uint64_t r[4];
int j;