modelize_property: use resolve_mtype_unchecked during build_signature
[nit.git] / lib / standard / collection / range.nit
index d187cfb..da68294 100644 (file)
@@ -49,8 +49,13 @@ class Range[E: Discrete]
 
        redef fun iterator do return new IteratorRange[E](self)
 
+       #     assert [1..10].length             == 10
+       #     assert [1..10[.length             == 9
+       #     assert [1..1].length              == 1
+       #     assert [1..-10].length    == 0
        redef fun length
        do
+               if is_empty then return 0
                var nb = first.distance(after)
                if nb > 0 then
                        return nb
@@ -90,6 +95,29 @@ class Range[E: Discrete]
                last = to.predecessor(1)
                after = to
        end
+
+       # Two ranges are equals if they have the same first and last elements.
+       #
+       #     var a = new Range[Int](10, 15)
+       #     var b = new Range[Int].without_last(10, 15)
+       #     assert a == [10..15]
+       #     assert a == [10..16[
+       #     assert not a == [10..15[
+       #     assert b == [10..15[
+       #     assert b == [10..14]
+       #     assert not b == [10..15]
+       redef fun ==(o) do
+               return o isa Range[E] and self.first == o.first and self.last == o.last
+       end
+
+       #     var a = new Range[Int](10, 15)
+       #     assert a.hash == 455
+       #     var b = new Range[Int].without_last(10, 15)
+       #     assert b.hash == 432
+       redef fun hash do
+               # 11 and 23 are magic numbers empirically determined to be not so bad.
+               return first.hash * 11 + last.hash * 23
+       end
 end
 
 private class IteratorRange[E: Discrete]
@@ -111,12 +139,12 @@ end
 redef class Int
        # Returns the range from 0 to `self-1`, is used to do:
        #
-       #    var s = new Array[String]
-       #    for i in 3.times do s.add "cool"
-       #    assert s.join(" ") == "cool cool cool"
+       #     var s = new Array[String]
+       #     for i in 3.times do s.add "cool"
+       #     assert s.join(" ") == "cool cool cool"
        #
-       #    s.clear
-       #    for i in 10.times do s.add(i.to_s)
-       #    assert s.to_s == "0123456789"
+       #     s.clear
+       #     for i in 10.times do s.add(i.to_s)
+       #     assert s.to_s == "0123456789"
        fun times: Range[Int] do return [0 .. self[
 end