@@ -24,11 +24,6 @@ similar(r::Range1, T::Type, dims::Dims) = Range1(convert(T, r.start), convert(T,
2424
2525typealias Ranges Union (Range ,Range1)
2626
27- ref (r:: Range , s:: Range {Index }) = Range (r[s[1 ]],r .step * s .step ,r[s[end]])
28- ref (r:: Range1, s:: Range {Index }) = Range (r[s[1 ]],s .step ,r[s[end]])
29- ref (r:: Range , s:: Range1{Index }) = Range (r[s[1 ]],r .step ,r[s[end]])
30- ref (r:: Range1, s:: Range1{Index }) = Range1 (r[s[1 ]],r[s[end]])
31-
3227step (r:: Range ) = r .step
3328step (r:: Range1) = one (r .start )
3429
@@ -63,6 +58,11 @@ next{T}(r::Range{T}, st) = (r.start+st*r.step, st+1)
6358colon (start:: Real, stop:: Real, step:: Real) = Range (start, step, stop)
6459colon (start:: Real, stop:: Real) = Range1 (start, stop)
6560
61+ ref (r:: Range , s:: Range {Index }) = Range (r[s[1 ]],r .step * s .step ,r[s[end]])
62+ ref (r:: Range1, s:: Range {Index }) = Range (r[s[1 ]],s .step ,r[s[end]])
63+ ref (r:: Range , s:: Range1{Index }) = Range (r[s[1 ]],r .step ,r[s[end]])
64+ ref (r:: Range1, s:: Range1{Index }) = Range1 (r[s[1 ]],r[s[end]])
65+
6666function ref (r :: Ranges , i :: Int )
6767 if i < 1; error(BoundsError); end
6868 x = r.start + (i-1)*step(r)
@@ -72,6 +72,23 @@ function ref(r::Ranges, i::Int)
7272 return x
7373end
7474
75+ intersect(r::Range1, s::Range1) = max(r.start,s.start):min(r.stop,s.stop)
76+
77+ intersect(r::Range, s::Range1) = intersect(s, r)
78+
79+ function intersect(r::Range1, s::Range)
80+ sta = start(s)
81+ ste = step(s)
82+ sto = s[end]
83+ lo = r.start
84+ hi = r.stop
85+ i0 = max(lo, sta + ste*div((lo-sta)+ste-1, ste))
86+ i1 = min(hi, sta + ste*div((hi-sta), ste))
87+ i0 = max(i0, sta)
88+ i1 = min(i1, sto)
89+ i0:ste:i1
90+ end
91+
7592## linear operations on 1-d ranges ##
7693
7794-(r::Ranges) = Range(-r.start, -step(r), -r.stop)
0 commit comments