diff options
| author | mattn <[email protected]> | 2013-03-26 23:03:19 +0900 |
|---|---|---|
| committer | mattn <[email protected]> | 2013-03-26 23:03:19 +0900 |
| commit | 46a46733082df9f2500541892dfd5f86666516e0 (patch) | |
| tree | e34d4afbf7030cef2aeafaa10faefad2ecfa5234 /mrbgems/mruby-random/src/random.c | |
| parent | 523118ceee14493566240efede0f082ffe167b66 (diff) | |
| download | mruby-46a46733082df9f2500541892dfd5f86666516e0.tar.gz mruby-46a46733082df9f2500541892dfd5f86666516e0.zip | |
Refactoring mruby-rand
Diffstat (limited to 'mrbgems/mruby-random/src/random.c')
| -rw-r--r-- | mrbgems/mruby-random/src/random.c | 170 |
1 files changed, 36 insertions, 134 deletions
diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c index 3dcf39709..599dcc381 100644 --- a/mrbgems/mruby-random/src/random.c +++ b/mrbgems/mruby-random/src/random.c @@ -55,178 +55,80 @@ static mrb_value mrb_random_mt_rand(mrb_state *mrb, mrb_value max) return value; } - -static mrb_value mrb_random_g_rand(mrb_state *mrb, mrb_value self) +static mrb_value get_opt(mrb_state* mrb) { - mrb_value *argv; - mrb_int argc; - mrb_value max; - - mrb_get_args(mrb, "*", &argv, &argc); + mrb_value arg; - if (argc == 0) { - max = mrb_fixnum_value(0); - } else if (argc == 1) { - max = argv[0]; - if (!mrb_nil_p(max) && !mrb_fixnum_p(max)) { - max = mrb_check_convert_type(mrb, max, MRB_TT_FIXNUM, "Fixnum", "to_int"); - } - if (!mrb_nil_p(max) && mrb_fixnum(max) < 0) { - max = mrb_fixnum_value(0 - mrb_fixnum(max)); - } + arg = mrb_fixnum_value(0); + mrb_get_args(mrb, "|o", &arg); - if (!mrb_fixnum_p(max)) { + if (!mrb_nil_p(arg)) { + if (!mrb_fixnum_p(arg)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type"); - return mrb_nil_value(); } - } else { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc); - return mrb_nil_value(); + arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int"); + if (mrb_fixnum(arg) < 0) { + arg = mrb_fixnum_value(0 - mrb_fixnum(arg)); + } } + return arg; +} - mrb_value seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY)); - if (mrb_nil_p(seed)) - mrb_random_mt_srand(mrb, mrb_nil_value()); +static mrb_value mrb_random_g_rand(mrb_state *mrb, mrb_value self) +{ + mrb_value max; + mrb_value seed; + max = get_opt(mrb); + seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY)); + if (mrb_nil_p(seed)) { + mrb_random_mt_srand(mrb, mrb_nil_value()); + } return mrb_random_mt_rand(mrb, max); } static mrb_value mrb_random_g_srand(mrb_state *mrb, mrb_value self) { - mrb_int argc; - mrb_value *argv; mrb_value seed; + mrb_value old_seed; - mrb_get_args(mrb, "*", &argv, &argc); - - if (argc == 0) { - seed = mrb_nil_value(); - } else if (argc == 1) { - seed = argv[0]; - if (!mrb_nil_p(seed) && !mrb_fixnum_p(seed)) { - seed = mrb_check_convert_type(mrb, seed, MRB_TT_FIXNUM, "Fixnum", "to_int"); - } - if (!mrb_nil_p(seed) && mrb_fixnum(seed) < 0) { - seed = mrb_fixnum_value(0 - mrb_fixnum(seed)); - } - - if (!mrb_fixnum_p(seed)) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type"); - return mrb_nil_value(); - } - } else { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc); - return mrb_nil_value(); - } - + seed = get_opt(mrb); seed = mrb_random_mt_srand(mrb, seed); - mrb_value old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY)); + old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY)); mrb_gv_set(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY), seed); - return old_seed; } static mrb_value mrb_random_init(mrb_state *mrb, mrb_value self) { - mrb_int argc; - mrb_value *argv; mrb_value seed; - mrb_get_args(mrb, "*", &argv, &argc); - - if (argc == 0) { - seed = mrb_nil_value(); - } else if (argc == 1) { - seed = argv[0]; - if (!mrb_nil_p(seed) && !mrb_fixnum_p(seed)) { - seed = mrb_check_convert_type(mrb, seed, MRB_TT_FIXNUM, "Fixnum", "to_int"); - } - if (!mrb_nil_p(seed) && mrb_fixnum(seed) < 0) { - seed = mrb_fixnum_value(0 - mrb_fixnum(seed)); - } - - if (!mrb_fixnum_p(seed)) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type"); - return mrb_nil_value(); - } - } else { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc); - return mrb_nil_value(); - } - + seed = get_opt(mrb); seed = mrb_random_mt_srand(mrb, seed); mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY), seed); - return self; } static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self) { - mrb_value *argv; - mrb_int argc; mrb_value max; - mrb_get_args(mrb, "*", &argv, &argc); - - if (argc == 0) { - max = mrb_fixnum_value(0); - } else if (argc == 1) { - max = argv[0]; - if (!mrb_nil_p(max) && !mrb_fixnum_p(max)) { - max = mrb_check_convert_type(mrb, max, MRB_TT_FIXNUM, "Fixnum", "to_int"); - } - if (!mrb_nil_p(max) && mrb_fixnum(max) < 0) { - max = mrb_fixnum_value(0 - mrb_fixnum(max)); - } - - if (!mrb_fixnum_p(max)) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type"); - return mrb_nil_value(); - } - } else { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc); - return mrb_nil_value(); - } - + max = get_opt(mrb); mrb_value seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY)); - if (mrb_nil_p(seed)) + if (mrb_nil_p(seed)) { mrb_random_mt_srand(mrb, mrb_nil_value()); - + } return mrb_random_mt_rand(mrb, max); } static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self) { - mrb_int argc; - mrb_value *argv; mrb_value seed; - mrb_get_args(mrb, "*", &argv, &argc); - - if (argc == 0) { - seed = mrb_nil_value(); - } else if (argc == 1) { - seed = argv[0]; - if (!mrb_nil_p(seed) && !mrb_fixnum_p(seed)) { - seed = mrb_check_convert_type(mrb, seed, MRB_TT_FIXNUM, "Fixnum", "to_int"); - } - if (!mrb_nil_p(seed) && mrb_fixnum(seed) < 0) { - seed = mrb_fixnum_value(0 - mrb_fixnum(seed)); - } - - if (!mrb_fixnum_p(seed)) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type"); - return mrb_nil_value(); - } - } else { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc); - return mrb_nil_value(); - } - + seed = get_opt(mrb); seed = mrb_random_mt_srand(mrb, seed); mrb_value old_seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY)); mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY), seed); - return old_seed; } @@ -234,16 +136,16 @@ void mrb_mruby_random_gem_init(mrb_state *mrb) { struct RClass *random; - mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, ARGS_ANY()); - mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, ARGS_ANY()); + mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, ARGS_OPT(1)); + mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, ARGS_OPT(1)); random = mrb_define_class(mrb, "Random", mrb->object_class); - mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, ARGS_ANY()); - mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, ARGS_ANY()); + mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, ARGS_OPT(1)); + mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, ARGS_OPT(1)); - mrb_define_method(mrb, random, "initialize", mrb_random_init, ARGS_ANY()); - mrb_define_method(mrb, random, "rand", mrb_random_rand, ARGS_ANY()); - mrb_define_method(mrb, random, "srand", mrb_random_srand, ARGS_ANY()); + mrb_define_method(mrb, random, "initialize", mrb_random_init, ARGS_OPT(1)); + mrb_define_method(mrb, random, "rand", mrb_random_rand, ARGS_OPT(1)); + mrb_define_method(mrb, random, "srand", mrb_random_srand, ARGS_OPT(1)); } void mrb_mruby_random_gem_final(mrb_state *mrb) |
