class Range

Redefine a method {#==} so as to handle a comparison with {Rangesmaller}.

Public Instance Methods

==(r) click to toggle source

When compared with either {Rangesmaller} object, it will deal with it. For each element, that is, {#begin} and {#end}, this uses ==() method of each element. See {#eql?}.

# File lib/rangesmaller/rangesmaller.rb, line 585
def ==(r)
  equal_core(r, :==, :equal_prerangesmaller?)
end
Also aliased as: equal_prerangesmaller?
empty?() click to toggle source

Returns true if self is empty, namely, there is no possible member, and if it is still valid. If it is not valid, it returns nil. Otherwise, false.

Examples

(nil..nil).empty?       # => nil
Rangesmaller(1..2).empty?   # => false
Rangesmaller(1...2).empty?  # => nil
Rangesmaller(1...2,   :exclude_begin => true).empty?  => true
Rangesmaller(1.0...2, :exclude_begin => true).empty?  => true
Rangesmaller(1...2,   :exclude_begin => true).empty?  => true
Rangesmaller(1.0...2, :exclude_begin => true).empty?  => false
Rangesmaller(?a...?b, :exclude_begin => true).empty?  => true
RangeOpen::NONE.empty?  # => true

@note to check whether it is either empty or invalid, use {#null?}.

See {#valid?}, too.
# File lib/rangesmaller/rangesmaller.rb, line 667
def empty?
  if !valid?
    return nil
  elsif defined?(self.is_none?) && self.is_none?
    return true
  end

  t = (self.begin() <=> self.end())
  case t
  when -1
    if (defined?(self.exclude_begin?)) &&
        exclude_begin? &&
        exclude_end? &&
        defined?(self.begin().succ) &&
        (self.begin().succ == self.end())
      true    # e.g., ("a"<..."b")
    else
      false
    end
  when 0
    if defined?(self.boundary) && self.boundary.nil?
      # RangeOpen::NONE or RangeOpen::All
      if self.exclude_end?
        true  # RangeOpen::Null
      else
        false # RangeOpen::All
      end
    else
      if defined?(self.exclude_begin?)
        t2 = self.exclude_begin?
      else
        t2 = false
      end
      (t2 && exclude_end?)
    end
  when 1
    nil
  else
    nil       # eg. (nil..nil)
  end
end
eql?(r) click to toggle source

Same as {#==}, but the comparison is made with eql?() method.

# File lib/rangesmaller/rangesmaller.rb, line 593
def eql?(r)
  equal_core(r, :eql?, :eql_prerangesmaller?)
end
Also aliased as: eql_prerangesmaller?
eql_prerangesmaller?(r)
Alias for: eql?
equal_prerangesmaller?(r)
Alias for: ==
null?() click to toggle source

Returns true if it is either empty or invalid. See {#empty?} and {#valid?}.

# File lib/rangesmaller/rangesmaller.rb, line 712
def null?
  (! valid?) || empty?
end
valid?() click to toggle source

Returns true if self is valid as a Range (or Rangesmaller or RangeOpen), even if it is empty. To construct a valid range, the elements have to be Comparable, and {#end} is larger than, or equal to, {#begin}.

Examples

(nil..nil).valid? # => false
(0..0).valid?     # => true
(0...0).valid?    # => false
(2..-1).valid?    # => false
Rangesmaller(0...0, :exclude_begin => false)  # => false
Rangesmaller(0...0, :exclude_begin => true)   # => true
RangeOpen::NONE.valid? #=> true
RangeOpen(5).valid?    #=> true
RangeOpen::ALL.valid?  #=> true

See {#empty?} and {#null?}

# File lib/rangesmaller/rangesmaller.rb, line 615
def valid?
  if defined?(self.is_none?) && self.is_none?
    return true
  end
  begin
    t = (self.begin() <=> self.end())
  rescue NoMethodError
    false     # return
  else
    case t
    when -1
      true
    when 0
      if is_comparable?(self.begin())
        if defined?(self.exclude_begin?)
          t = self.exclude_begin?
        else
          t = false
        end
        (t ^! exclude_end?)   # True if single value or empty.
      else
        false         # Not Comparable; eg., nil..nil
      end
    when 1
      false
    else
      false   # Not Comparable.
    end
    # All statements of return above.
  end
end

Private Instance Methods

equal_core(r, method, method_pre) click to toggle source

@param r [Object] to compare. @param method [Symbol] of the method name. @param method_pre [Symbol] of the backed-up original method name.

# File lib/rangesmaller/rangesmaller.rb, line 733
def equal_core(r, method, method_pre)
  if ! defined? r.exclude_end?
    false     # Not Range family.
  elsif defined? r.exclude_begin?
    # Either Rangesmaller or RangeOpen object.
    if r.exclude_begin?
      false   # self(Range) has always the inclusive begin.
    else
      # It could do with a single line,
      #    self.begin.send(method_pre, r)
      # if this was for Rangesmaller===r, but not for RangeOpen.
      if (self.exclude_end? ^ r.exclude_end?)
        false
      elsif (self.begin.send(method, r.begin) && self.end.send(method, r.end))
        true
      else
        false
      end
    end
  else
    self.send(method_pre, r)  # r is Range.
  end
end
is_comparable?(obj) click to toggle source

True if obj is Comparable.

# File lib/rangesmaller/rangesmaller.rb, line 722
def is_comparable?(obj)
  if defined?(obj.<=) # Comparable?
    true
  else
    false
  end
end