mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Remove some overhead from methods defined in Ruby in Complex.
This commit is contained in:
@@ -1,19 +1,8 @@
|
||||
class Complex < Numeric
|
||||
def initialize(real, imaginary)
|
||||
real = real.to_f unless real.is_a? Numeric
|
||||
imaginary = imaginary.to_f unless imaginary.is_a? Numeric
|
||||
@real = real
|
||||
@imaginary = imaginary
|
||||
end
|
||||
|
||||
def self.polar(abs, arg = 0)
|
||||
Complex(abs * Math.cos(arg), abs * Math.sin(arg))
|
||||
end
|
||||
|
||||
def self.rectangular(real, imaginary = 0)
|
||||
_new(real, imaginary)
|
||||
end
|
||||
|
||||
def inspect
|
||||
"(#{to_s})"
|
||||
end
|
||||
@@ -23,43 +12,43 @@ class Complex < Numeric
|
||||
end
|
||||
|
||||
def +@
|
||||
Complex._new(real, imaginary)
|
||||
Complex(real, imaginary)
|
||||
end
|
||||
|
||||
def -@
|
||||
Complex._new(-real, -imaginary)
|
||||
Complex(-real, -imaginary)
|
||||
end
|
||||
|
||||
def +(rhs)
|
||||
if rhs.is_a? Complex
|
||||
Complex._new(real + rhs.real, imaginary + rhs.imaginary)
|
||||
Complex(real + rhs.real, imaginary + rhs.imaginary)
|
||||
elsif rhs.is_a? Numeric
|
||||
Complex._new(real + rhs, imaginary)
|
||||
Complex(real + rhs, imaginary)
|
||||
end
|
||||
end
|
||||
|
||||
def -(rhs)
|
||||
if rhs.is_a? Complex
|
||||
Complex._new(real - rhs.real, imaginary - rhs.imaginary)
|
||||
Complex(real - rhs.real, imaginary - rhs.imaginary)
|
||||
elsif rhs.is_a? Numeric
|
||||
Complex._new(real - rhs, imaginary)
|
||||
Complex(real - rhs, imaginary)
|
||||
end
|
||||
end
|
||||
|
||||
def *(rhs)
|
||||
if rhs.is_a? Complex
|
||||
Complex._new(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
|
||||
Complex(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
|
||||
elsif rhs.is_a? Numeric
|
||||
Complex._new(real * rhs, imaginary * rhs)
|
||||
Complex(real * rhs, imaginary * rhs)
|
||||
end
|
||||
end
|
||||
|
||||
def /(rhs)
|
||||
if rhs.is_a? Complex
|
||||
div = rhs.real * rhs.real + rhs.imaginary * rhs.imaginary
|
||||
Complex._new((real * rhs.real + imaginary * rhs.imaginary) / div, (rhs.real * imaginary - real * rhs.imaginary) / div)
|
||||
Complex((real * rhs.real + imaginary * rhs.imaginary) / div, (rhs.real * imaginary - real * rhs.imaginary) / div)
|
||||
elsif rhs.is_a? Numeric
|
||||
Complex._new(real / rhs, imaginary / rhs)
|
||||
Complex(real / rhs, imaginary / rhs)
|
||||
end
|
||||
end
|
||||
alias_method :quo, :/
|
||||
@@ -117,12 +106,6 @@ class Complex < Numeric
|
||||
alias_method :imag, :imaginary
|
||||
end
|
||||
|
||||
module Kernel
|
||||
def Complex(real, imaginary = 0)
|
||||
Complex.rectangular(real, imaginary)
|
||||
end
|
||||
end
|
||||
|
||||
[Fixnum, Float].each do |cls|
|
||||
[:+, :-, :*, :/, :==].each do |op|
|
||||
cls.instance_exec do
|
||||
|
||||
@@ -76,11 +76,11 @@ complex_imaginary(mrb_state *mrb, mrb_value self)
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
complex_s_new(mrb_state *mrb, mrb_value self)
|
||||
complex_s_rect(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
mrb_float real, imaginary;
|
||||
mrb_float real, imaginary = 0.0;
|
||||
|
||||
mrb_get_args(mrb, "ff", &real, &imaginary);
|
||||
mrb_get_args(mrb, "f|f", &real, &imaginary);
|
||||
return complex_new(mrb, real, imaginary);
|
||||
}
|
||||
|
||||
@@ -125,7 +125,8 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
|
||||
comp = mrb_define_class(mrb, "Complex", mrb_class_get(mrb, "Numeric"));
|
||||
//MRB_SET_INSTANCE_TT(comp, MRB_TT_ISTRUCT);
|
||||
mrb_undef_class_method(mrb, comp, "new");
|
||||
mrb_define_class_method(mrb, comp, "_new", complex_s_new, MRB_ARGS_REQ(2));
|
||||
mrb_define_class_method(mrb, comp, "rectangular", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
|
||||
mrb_define_method(mrb, mrb->kernel_module, "Complex", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
|
||||
mrb_define_method(mrb, comp, "real", complex_real, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, comp, "imaginary", complex_imaginary, MRB_ARGS_NONE());
|
||||
#ifndef MRB_WITHOUT_FLOAT
|
||||
|
||||
Reference in New Issue
Block a user