Module: Matrix::CoercionHelper

Included in:
Matrix, Scalar, Vector
Defined in:
lib/matrix.rb

Overview

:nodoc:

Class Method Summary collapse

Class Method Details

.check_int(val, count, kind) ⇒ Object



1767
1768
1769
1770
1771
1772
1773
# File 'lib/matrix.rb', line 1767

def self.check_int(val, count, kind)
  val = CoercionHelper.coerce_to_int(val)
  if val >= count || val < -count
    raise IndexError, "given #{kind} #{val} is outside of #{-count}...#{count}"
  end
  val
end

.check_range(val, count, kind) ⇒ Object

Returns ‘nil` for non Ranges Checks range validity, return canonical range with 0 <= begin <= end < count



1757
1758
1759
1760
1761
1762
1763
1764
1765
# File 'lib/matrix.rb', line 1757

def self.check_range(val, count, kind)
  canonical = (val.begin + (val.begin < 0 ? count : 0))..
              (val.end ? val.end + (val.end < 0 ? count : 0) - (val.exclude_end? ? 1 : 0)
                       : count - 1)
  unless 0 <= canonical.begin && canonical.begin <= canonical.end && canonical.end < count
    raise IndexError, "given range #{val} is outside of #{kind} dimensions: 0...#{count}"
  end
  canonical
end

.coerce_to(obj, cls, meth) ⇒ Object

Helper method to coerce a value into a specific class. Raises a TypeError if the coercion fails or the returned value is not of the right class. (from Rubinius)

Raises:

  • (TypeError)


1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
# File 'lib/matrix.rb', line 1734

def self.coerce_to(obj, cls, meth) # :nodoc:
  return obj if obj.kind_of?(cls)
  raise TypeError, "Expected a #{cls} but got a #{obj.class}" unless obj.respond_to? meth
  begin
    ret = obj.__send__(meth)
  rescue Exception => e
    raise TypeError, "Coercion error: #{obj.inspect}.#{meth} => #{cls} failed:\n" \
                     "(#{e.message})"
  end
  raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.kind_of? cls
  ret
end

.coerce_to_int(obj) ⇒ Object



1747
1748
1749
# File 'lib/matrix.rb', line 1747

def self.coerce_to_int(obj)
  coerce_to(obj, Integer, :to_int)
end

.coerce_to_matrix(obj) ⇒ Object



1751
1752
1753
# File 'lib/matrix.rb', line 1751

def self.coerce_to_matrix(obj)
  coerce_to(obj, Matrix, :to_matrix)
end