summaryrefslogtreecommitdiff
path: root/include/ruby
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2016-05-07 11:51:14 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-09-07 20:08:01 +0900
commitaf5e87ab218c5f4e34c6cdb54ae119a7f0f9033f (patch)
treee050cf7f7af91f1b990287f6e17d26bc27b6171d /include/ruby
parentf4d5273989ae8d6569a62b126b2774706b86fbf5 (diff)
separate rb_random_t
* random.c: separate abstract rb_random_t and rb_random_mt_t for Mersenne Twister implementation. * include/ruby/random.h: the interface for extensions of Random class. * DLL imported symbol reference is not constant on Windows. * check if properly initialized.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3024
Diffstat (limited to 'include/ruby')
-rw-r--r--include/ruby/random.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/include/ruby/random.h b/include/ruby/random.h
new file mode 100644
index 0000000000..bb6cf73bae
--- /dev/null
+++ b/include/ruby/random.h
@@ -0,0 +1,80 @@
+#ifndef RUBY_RANDOM_H
+#define RUBY_RANDOM_H 1
+/**
+ * @file
+ * @date Sat May 7 11:51:14 JST 2016
+ * @copyright 2007-2020 Yukihiro Matsumoto
+ * @copyright This file is a part of the programming language Ruby.
+ * Permission is hereby granted, to either redistribute and/or
+ * modify this file, provided that the conditions mentioned in the
+ * file COPYING are met. Consult the file for details.
+ */
+
+#include "ruby/ruby.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#if 0
+} /* satisfy cc-mode */
+#endif
+#endif
+
+RUBY_SYMBOL_EXPORT_BEGIN
+
+typedef struct {
+ VALUE seed;
+} rb_random_t;
+
+typedef void rb_random_init_func(rb_random_t *, const uint32_t *, size_t);
+typedef unsigned int rb_random_get_int32_func(rb_random_t *);
+typedef void rb_random_get_bytes_func(rb_random_t *, void *, size_t);
+
+typedef struct {
+ size_t default_seed_bits;
+ rb_random_init_func *init;
+ rb_random_get_int32_func *get_int32;
+ rb_random_get_bytes_func *get_bytes;
+} rb_random_interface_t;
+
+#define rb_rand_if(obj) \
+ ((const rb_random_interface_t *)RTYPEDDATA_TYPE(obj)->data)
+
+#define RB_RANDOM_INTERFACE_DECLARE(prefix) \
+ static void prefix##_init(rb_random_t *, const uint32_t *, size_t); \
+ static unsigned int prefix##_get_int32(rb_random_t *); \
+ static void prefix##_get_bytes(rb_random_t *, void *, size_t); \
+ /* end */
+
+#define RB_RANDOM_INTERFACE_DEFINE(prefix) \
+ prefix##_init, \
+ prefix##_get_int32, \
+ prefix##_get_bytes, \
+ /* end */
+
+#if defined _WIN32 && !defined __CYGWIN__
+typedef rb_data_type_t rb_random_data_type_t;
+# define RB_RANDOM_PARENT 0
+# define RB_RANDOM_DATA_INIT_PARENT(random_data) \
+ (random_data.parent = &rb_random_data_type)
+#else
+typedef const rb_data_type_t rb_random_data_type_t;
+# define RB_RANDOM_PARENT &rb_random_data_type
+# define RB_RANDOM_DATA_INIT_PARENT(random_data) ((void)0)
+#endif
+
+void rb_random_mark(void *ptr);
+double rb_int_pair_to_real_exclusive(uint32_t a, uint32_t b);
+double rb_int_pair_to_real_inclusive(uint32_t a, uint32_t b);
+void rb_rand_bytes_int32(rb_random_get_int32_func *, rb_random_t *, void *, size_t);
+RUBY_EXTERN const rb_data_type_t rb_random_data_type;
+
+RUBY_SYMBOL_EXPORT_END
+
+#if defined(__cplusplus)
+#if 0
+{ /* satisfy cc-mode */
+#endif
+} /* extern "C" { */
+#endif
+
+#endif /* RUBY_RANDOM_H */