summaryrefslogtreecommitdiff
path: root/libguile/random.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-07-26 14:57:46 +0200
committerAndy Wingo <wingo@pobox.com>2010-07-26 15:01:02 +0200
commit99a0ee662050ad31e74acb3390d6901e3c916f57 (patch)
tree5e16269200f0d1847bd466d77e8345316119e648 /libguile/random.c
parentb606ff6af9c9ec7fc3c4473c09ce1e95c18f024a (diff)
downloadguile-99a0ee662050ad31e74acb3390d6901e3c916f57.tar.gz
refactor datum->random-state / random-state->datum
* libguile/random.c (scm_t_i_rstate): Move here from random.h, along with prototypes for functions (scm_i_uniform32, scm_i_init_rstate, scm_i_copy_rstate): Change to take a stock scm_t_rstate as an arg, and cast it. This way we don't cast the pointers below. (scm_i_rstate_from_datum, scm_i_rstate_from_datum): Same and rename from scm_i_init_rstate_scm / scm_i_expose_rstate. (scm_c_rstate_from_datum): Rename from scm_c_make_rstate_scm. (scm_datum_to_random_state, scm_random_state_to_datum): Rename from scm_external_to_random_state and scm_random_state_to_external. (scm_init_random): Remove casts. * libguile/random.h (scm_t_rng): Rename init_rstate_scm, expose_rstate vmethods to from_datum, to_datum. Remove internal definitions. Rename to scm_c_rstate_from_datum, and provide scm_random_state_to_datum and scm_datum_to_random_state.
Diffstat (limited to 'libguile/random.c')
-rw-r--r--libguile/random.c88
1 files changed, 50 insertions, 38 deletions
diff --git a/libguile/random.c b/libguile/random.c
index 67928df6d..a1191898c 100644
--- a/libguile/random.c
+++ b/libguile/random.c
@@ -71,25 +71,34 @@ scm_t_rng scm_the_rng;
* (http://stat.fsu.edu/~geo/diehard.html)
*/
+typedef struct scm_t_i_rstate {
+ scm_t_rstate rstate;
+ scm_t_uint32 w;
+ scm_t_uint32 c;
+} scm_t_i_rstate;
+
+
#define A 2131995753UL
#ifndef M_PI
#define M_PI 3.14159265359
#endif
-scm_t_uint32
-scm_i_uniform32 (scm_t_i_rstate *state)
+static scm_t_uint32
+scm_i_uniform32 (scm_t_rstate *state)
{
- scm_t_uint64 x = (scm_t_uint64) A * state->w + state->c;
+ scm_t_i_rstate *istate = (scm_t_i_rstate*) state;
+ scm_t_uint64 x = (scm_t_uint64) A * istate->w + istate->c;
scm_t_uint32 w = x & 0xffffffffUL;
- state->w = w;
- state->c = x >> 32L;
+ istate->w = w;
+ istate->c = x >> 32L;
return w;
}
-void
-scm_i_init_rstate (scm_t_i_rstate *state, const char *seed, int n)
+static void
+scm_i_init_rstate (scm_t_rstate *state, const char *seed, int n)
{
+ scm_t_i_rstate *istate = (scm_t_i_rstate*) state;
scm_t_uint32 w = 0L;
scm_t_uint32 c = 0L;
int i, m;
@@ -103,12 +112,12 @@ scm_i_init_rstate (scm_t_i_rstate *state, const char *seed, int n)
}
if ((w == 0 && c == 0) || (w == -1 && c == A - 1))
++c;
- state->w = w;
- state->c = c;
+ istate->w = w;
+ istate->c = c;
}
-scm_t_i_rstate *
-scm_i_copy_rstate (scm_t_i_rstate *state)
+static scm_t_rstate *
+scm_i_copy_rstate (scm_t_rstate *state)
{
scm_t_rstate *new_state;
@@ -119,10 +128,11 @@ scm_i_copy_rstate (scm_t_i_rstate *state)
SCM_SYMBOL(scm_i_rstate_tag, "multiply-with-carry");
-void
-scm_i_init_rstate_scm (scm_t_i_rstate *state, SCM value)
-#define FUNC_NAME "scm_i_init_rstate_scm"
+static void
+scm_i_rstate_from_datum (scm_t_rstate *state, SCM value)
+#define FUNC_NAME "scm_i_rstate_from_datum"
{
+ scm_t_i_rstate *istate = (scm_t_i_rstate*) state;
scm_t_uint32 w, c;
long length;
@@ -133,17 +143,18 @@ scm_i_init_rstate_scm (scm_t_i_rstate *state, SCM value)
SCM_VALIDATE_UINT_COPY (SCM_ARG1, SCM_CADR (value), w);
SCM_VALIDATE_UINT_COPY (SCM_ARG1, SCM_CADDR (value), c);
- state->w = w;
- state->c = c;
+ istate->w = w;
+ istate->c = c;
}
#undef FUNC_NAME
-SCM
-scm_i_expose_rstate (scm_t_i_rstate *state)
+static SCM
+scm_i_rstate_to_datum (scm_t_rstate *state)
{
+ scm_t_i_rstate *istate = (scm_t_i_rstate*) state;
return scm_list_3 (scm_i_rstate_tag,
- scm_from_uint32 (state->w),
- scm_from_uint32 (state->c));
+ scm_from_uint32 (istate->w),
+ scm_from_uint32 (istate->c));
}
@@ -164,14 +175,14 @@ scm_c_make_rstate (const char *seed, int n)
}
scm_t_rstate *
-scm_c_make_rstate_scm (SCM external)
+scm_c_rstate_from_datum (SCM datum)
{
scm_t_rstate *state;
state = scm_gc_malloc_pointerless (scm_the_rng.rstate_size,
"random-state");
state->reserved0 = 0;
- scm_the_rng.init_rstate_scm (state, external);
+ scm_the_rng.from_datum (state, datum);
return state;
}
@@ -400,25 +411,26 @@ SCM_DEFINE (scm_seed_to_random_state, "seed->random-state", 1, 0, 0,
}
#undef FUNC_NAME
-SCM_DEFINE (scm_external_to_random_state, "external->random-state", 1, 0, 0,
- (SCM external),
- "Return a new random state using @var{external}.\n"
+SCM_DEFINE (scm_datum_to_random_state, "datum->random-state", 1, 0, 0,
+ (SCM datum),
+ "Return a new random state using @var{datum}.\n"
"\n"
- "@var{external} must be an external state representation obtained\n"
- "from @code{random-state->external}.")
-#define FUNC_NAME s_scm_external_to_random_state
+ "@var{datum} must be an external state representation obtained\n"
+ "from @code{random-state->datum}.")
+#define FUNC_NAME s_scm_datum_to_random_state
{
- return make_rstate (scm_c_make_rstate_scm (external));
+ return make_rstate (scm_c_rstate_from_datum (datum));
}
#undef FUNC_NAME
-SCM_DEFINE (scm_random_state_to_external, "random-state->external", 1, 0, 0,
+SCM_DEFINE (scm_random_state_to_datum, "random-state->datum", 1, 0, 0,
(SCM state),
- "Return an external representation of @var{state}.")
-#define FUNC_NAME s_scm_random_state_to_external
+ "Return a datum representation of @var{state} that may be\n"
+ "written out and read back with the Scheme reader.")
+#define FUNC_NAME s_scm_random_state_to_datum
{
SCM_VALIDATE_RSTATE (1, state);
- return scm_the_rng.expose_rstate (SCM_RSTATE (state));
+ return scm_the_rng.to_datum (SCM_RSTATE (state));
}
#undef FUNC_NAME
@@ -618,11 +630,11 @@ scm_init_random ()
scm_t_rng rng =
{
sizeof (scm_t_i_rstate),
- (scm_t_uint32 (*)()) scm_i_uniform32,
- (void (*)()) scm_i_init_rstate,
- (scm_t_rstate *(*)()) scm_i_copy_rstate,
- (void (*)(scm_t_rstate *, SCM)) scm_i_init_rstate_scm,
- (SCM (*)(scm_t_rstate *)) scm_i_expose_rstate
+ scm_i_uniform32,
+ scm_i_init_rstate,
+ scm_i_copy_rstate,
+ scm_i_rstate_from_datum,
+ scm_i_rstate_to_datum
};
scm_the_rng = rng;