summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-random
diff options
context:
space:
mode:
authordearblue <[email protected]>2021-10-31 23:36:10 +0900
committerdearblue <[email protected]>2021-10-31 23:36:10 +0900
commit7bb4a57e5626d8c959bf9b32b96dc6caf0f6f1b2 (patch)
tree7882fe645181b56635e46bcf5f48666b30ee7333 /mrbgems/mruby-random
parentd8204d51afc0e22aa5e720386af36ca12ddd3b01 (diff)
downloadmruby-7bb4a57e5626d8c959bf9b32b96dc6caf0f6f1b2.tar.gz
mruby-7bb4a57e5626d8c959bf9b32b96dc6caf0f6f1b2.zip
Added `Random.#bytes` method
ref: https://docs.ruby-lang.org/ja/3.0.0/method/Random/i/bytes.html
Diffstat (limited to 'mrbgems/mruby-random')
-rw-r--r--mrbgems/mruby-random/src/random.c27
-rw-r--r--mrbgems/mruby-random/test/random.rb14
2 files changed, 41 insertions, 0 deletions
diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c
index 0728e6bf2..ae917d33e 100644
--- a/mrbgems/mruby-random/src/random.c
+++ b/mrbgems/mruby-random/src/random.c
@@ -11,6 +11,7 @@
#include <mruby/array.h>
#include <mruby/istruct.h>
#include <mruby/presym.h>
+#include <mruby/string.h>
#include <time.h>
@@ -213,6 +214,23 @@ random_m_srand(mrb_state *mrb, mrb_value self)
return mrb_int_value(mrb, (mrb_int)old_seed);
}
+static mrb_value
+random_m_bytes(mrb_state *mrb, mrb_value self)
+{
+ rand_state *t = random_ptr(self);
+
+ mrb_int i;
+ mrb_get_args(mrb, "i", &i);
+
+ mrb_value bytes = mrb_str_new(mrb, NULL, i);
+ uint8_t *p = (uint8_t*)RSTRING_PTR(bytes);
+ for (; i > 0; i--, p++) {
+ *p = (uint8_t)rand_uint32(t);
+ }
+
+ return bytes;
+}
+
/*
* call-seq:
* ary.shuffle! -> ary
@@ -349,6 +367,13 @@ random_f_srand(mrb_state *mrb, mrb_value self)
return random_m_srand(mrb, random);
}
+static mrb_value
+random_f_bytes(mrb_state *mrb, mrb_value self)
+{
+ mrb_value random = random_default(mrb);
+ return random_m_bytes(mrb, random);
+}
+
void mrb_mruby_random_gem_init(mrb_state *mrb)
{
@@ -364,10 +389,12 @@ void mrb_mruby_random_gem_init(mrb_state *mrb)
MRB_SET_INSTANCE_TT(random, MRB_TT_ISTRUCT);
mrb_define_class_method(mrb, random, "rand", random_f_rand, MRB_ARGS_OPT(1));
mrb_define_class_method(mrb, random, "srand", random_f_srand, MRB_ARGS_OPT(1));
+ mrb_define_class_method(mrb, random, "bytes", random_f_bytes, MRB_ARGS_REQ(1));
mrb_define_method(mrb, random, "initialize", random_m_init, MRB_ARGS_OPT(1));
mrb_define_method(mrb, random, "rand", random_m_rand, MRB_ARGS_OPT(1));
mrb_define_method(mrb, random, "srand", random_m_srand, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, random, "bytes", random_m_bytes, MRB_ARGS_REQ(1));
mrb_define_method(mrb, array, "shuffle", mrb_ary_shuffle, MRB_ARGS_OPT(1));
mrb_define_method(mrb, array, "shuffle!", mrb_ary_shuffle_bang, MRB_ARGS_OPT(1));
diff --git a/mrbgems/mruby-random/test/random.rb b/mrbgems/mruby-random/test/random.rb
index 37583c5d3..4a2f08261 100644
--- a/mrbgems/mruby-random/test/random.rb
+++ b/mrbgems/mruby-random/test/random.rb
@@ -31,6 +31,20 @@ assert("Random.srand") do
assert_not_equal(r1, r3)
end
+assert("Random#bytes") do
+ r = Random.new(10)
+ num = 11
+ a = r.bytes(num)
+ assert_kind_of String, a
+ assert_equal num, a.bytesize
+ b = r.bytes(num)
+ assert_kind_of String, b
+ assert_equal num, b.bytesize
+ assert_not_equal a, b
+ b = r.bytes(num / 2)
+ assert_equal num / 2, b.bytesize
+end
+
assert("return class of Kernel.rand") do
assert_kind_of(Integer, rand(3))
assert_kind_of(Integer, rand(1.5))