Ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c52d4d35cc6a173c89eda98ceffa2dcf)
random.h
Go to the documentation of this file.
1#ifndef RUBY_RANDOM_H
2#define RUBY_RANDOM_H 1
13#include "ruby/ruby.h"
14
16
19};
21
22typedef void rb_random_init_func(rb_random_t *, const uint32_t *, size_t);
23typedef unsigned int rb_random_get_int32_func(rb_random_t *);
24typedef void rb_random_get_bytes_func(rb_random_t *, void *, size_t);
25typedef double rb_random_get_real_func(rb_random_t *, int);
26
27typedef struct {
34
35#define RB_RANDOM_INTERFACE_DECLARE(prefix) \
36 static void prefix##_init(rb_random_t *, const uint32_t *, size_t); \
37 static unsigned int prefix##_get_int32(rb_random_t *); \
38 static void prefix##_get_bytes(rb_random_t *, void *, size_t)
39
40#define RB_RANDOM_INTERFACE_DECLARE_WITH_REAL(prefix) \
41 RB_RANDOM_INTERFACE_DECLARE(prefix); \
42 static double prefix##_get_real(rb_random_t *, int)
43
44#define RB_RANDOM_INTERFACE_DEFINE(prefix) \
45 prefix##_init, \
46 prefix##_get_int32, \
47 prefix##_get_bytes
48
49#define RB_RANDOM_INTERFACE_DEFINE_WITH_REAL(prefix) \
50 RB_RANDOM_INTERFACE_DEFINE(prefix), \
51 prefix##_get_real
52
53#if defined _WIN32 && !defined __CYGWIN__
55# define RB_RANDOM_PARENT 0
56#else
58# define RB_RANDOM_PARENT &rb_random_data_type
59#endif
60
61#define RB_RANDOM_DATA_INIT_PARENT(random_data) \
62 rbimpl_random_data_init_parent(&random_data)
63
64void rb_random_mark(void *ptr);
66double rb_int_pair_to_real(uint32_t a, uint32_t b, int excl);
69
71
73/* :TODO: can this function be __attribute__((returns_nonnull)) or not? */
74static inline const rb_random_interface_t *
75rb_rand_if(VALUE obj)
76{
77 RBIMPL_ASSERT_OR_ASSUME(RTYPEDDATA_P(obj));
78 const struct rb_data_type_struct *t = RTYPEDDATA_TYPE(obj);
79 const void *ret = t->data;
80 return RBIMPL_CAST((const rb_random_interface_t *)ret);
81}
82
84static inline void
85rbimpl_random_data_init_parent(rb_random_data_type_t *random_data)
86{
87#if defined _WIN32 && !defined __CYGWIN__
88 random_data->parent = &rb_random_data_type;
89#endif
90}
91
92#endif /* RUBY_RANDOM_H */
#define RBIMPL_ASSERT_OR_ASSUME(expr)
This is either RUBY_ASSERT or RBIMPL_ASSUME, depending on RUBY_DEBUG.
Definition: assert.h:229
struct RIMemo * ptr
Definition: debug.c:88
#define RUBY_EXTERN
Definition: dllexport.h:36
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
Definition: dllexport.h:86
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
Definition: dllexport.h:77
void rb_random_init_func(rb_random_t *, const uint32_t *, size_t)
Definition: random.h:22
const rb_data_type_t rb_random_data_type
Definition: random.c:249
void rb_random_mark(void *ptr)
void rb_random_get_bytes_func(rb_random_t *, void *, size_t)
Definition: random.h:24
const rb_data_type_t rb_random_data_type_t
Definition: random.h:57
double rb_random_get_real_func(rb_random_t *, int)
Definition: random.h:25
double rb_int_pair_to_real(uint32_t a, uint32_t b, int excl)
Definition: random.c:1036
void rb_rand_bytes_int32(rb_random_get_int32_func *, rb_random_t *, void *, size_t)
Definition: random.c:1182
unsigned int rb_random_get_int32_func(rb_random_t *)
Definition: random.h:23
void rb_random_base_init(rb_random_t *rnd)
Definition: random.c:333
#define RBIMPL_ATTR_NOALIAS()
Wraps (or simulates) __declspec((noalias))
Definition: noalias.h:55
#define RBIMPL_ATTR_PURE_UNLESS_DEBUG()
Enables RBIMPL_ATTR_PURE iff.
Definition: pure.h:38
unsigned int uint32_t
Definition: sha2.h:101
#define const
Definition: strftime.c:108
rb_random_init_func * init
Definition: random.h:29
size_t default_seed_bits
Definition: random.h:28
rb_random_get_int32_func * get_int32
Definition: random.h:30
rb_random_get_real_func * get_real
Definition: random.h:32
rb_random_get_bytes_func * get_bytes
Definition: random.h:31
VALUE seed
Definition: random.h:18
#define t
Definition: symbol.c:253
unsigned long VALUE
Definition: value.h:38