Skip to content

Commit

Permalink
Michael Granger added RDoc for range.c
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@5273 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
dave committed Dec 24, 2003
1 parent 036fdff commit 8983f9e
Showing 1 changed file with 184 additions and 0 deletions.
184 changes: 184 additions & 0 deletions range.c
Expand Up @@ -66,6 +66,15 @@ rb_range_new(beg, end, exclude_end)
return range;
}

/*
* call-seq:
* Range.new(start, end, exclusive=false) => range
*
* Constructs a range using the given <i>start</i> and <i>end</i>. If the third
* parameter is omitted or is <code>false</code>, the <i>range</i> will include
* the end object; otherwise, it will be excluded.
*/

static VALUE
range_initialize(argc, argv, range)
int argc;
Expand All @@ -83,13 +92,36 @@ range_initialize(argc, argv, range)
return Qnil;
}


/*
* call-seq:
* rng.exclude_end? => true or false
*
* Returns <code>true</code> if <i>rng</i> excludes its end value.
*/

static VALUE
range_exclude_end_p(range)
VALUE range;
{
return EXCL(range) ? Qtrue : Qfalse;
}


/*
* call-seq:
* rng == obj => true or false
*
* Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent
* beginning and end items (by comparing them with <code>==</code>), and has
* the same #exclude_end? setting as <i>rng</t>.
*
* (0..2) == (0..2) #=> true
* (0..2) == Range.new(0,2) #=> true
* (0..2) == (0...2) #=> false
*
*/

static VALUE
range_eq(range, obj)
VALUE range, obj;
Expand Down Expand Up @@ -131,6 +163,20 @@ r_le(a, b)
}


/*
* call-seq:
* rng.eql?(obj) => true or false
*
* Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent
* beginning and end items (by comparing them with #eql?), and has the same
* #exclude_end? setting as <i>rng</i>.
*
* (0..2) == (0..2) #=> true
* (0..2) == Range.new(0,2) #=> true
* (0..2) == (0...2) #=> false
*
*/

static VALUE
range_eql(range, obj)
VALUE range, obj;
Expand Down Expand Up @@ -206,6 +252,34 @@ range_each_func(range, func, v, e, arg)
}
}

/*
* call-seq:
* rng.step(n=1) {| obj | block } => rng
*
* Iterates over <i>rng</i>, passing each <i>n</i>th element to the block. If
* the range contains numbers or strings, natural ordering is used. Otherwise
* <code>step</code> invokes <code>succ</code> to iterate through range
* elements. The following code uses class <code>Xs</code>, which is defined
* in the class-level documentation.
*
* range = Xs.new(1)..Xs.new(10)
* range.step(2) {|x| puts x}
* range.step(3) {|x| puts x}
*
* <em>produces:</em>
*
* 1 x
* 3 xxx
* 5 xxxxx
* 7 xxxxxxx
* 9 xxxxxxxxx
* 1 x
* 4 xxxx
* 7 xxxxxxx
* 10 xxxxxxxxxx
*/


static VALUE
range_step(argc, argv, range)
int argc;
Expand Down Expand Up @@ -282,6 +356,22 @@ each_i(v, arg)
return rb_yield(v);
}

/*
* call-seq:
* rng.each {| i | block } => rng
*
* Iterates over the elements <i>rng</i>, passing each in turn to the
* block.
*
* (10..15).each do |n|
* print n, ' '
* end
*
* <em>produces:</em>
*
* 10 11 12 13 14 15
*/

static VALUE
range_each(range)
VALUE range;
Expand Down Expand Up @@ -318,13 +408,34 @@ range_each(range)
return range;
}

/*
* call-seq:
* rng.first => obj
* rng.begin => obj
*
* Returns the first object in <i>rng</i>.
*/

static VALUE
range_first(range)
VALUE range;
{
return rb_ivar_get(range, id_beg);
}


/*
* call-seq:
* rng.end => obj
* rng.last => obj
*
* Returns the object that defines the end of <i>rng</i>.
*
* (1..10).end #=> 10
* (1...10).end #=> 10
*/


static VALUE
range_last(range)
VALUE range;
Expand Down Expand Up @@ -435,6 +546,26 @@ range_member(range, val)
return args[1];
}

/*
* call-seq:
* rng === obj => true or false
*
* Returns <code>true</code> if <i>obj</i> is an element of
* <i>rng</i>, <code>false</code> otherwise. Conveniently,
* <code>===</code> is the comparison operator used by
* <code>case</code> statements.
*
* case 79
* when 1..50 then print "low\n"
* when 51..75 then print "medium\n"
* when 76..100 then print "high\n"
* end
*
* <em>produces:</em>
*
* high
*/

static VALUE
range_include(range, val)
VALUE range, val;
Expand All @@ -454,6 +585,59 @@ range_include(range, val)
return Qfalse;
}


/* A <code>Range</code> represents an interval---a set of values with a
* start and an end. Ranges may be constructed using the
* <em>s</em><code>..</code><em>e</em> and
* <em>s</em><code>...</code><em>e</em> literals, or with
* <code>Range::new</code>. Ranges constructed using <code>..</code>
* run from the start to the end inclusively. Those created using
* <code>...</code> exclude the end value. When used as an iterator,
* ranges return each value in the sequence.
*
* (-1..-5).to_a #=> []
* (-5..-1).to_a #=> [-5, -4, -3, -2, -1]
* ('a'..'e').to_a #=> ["a", "b", "c", "d", "e"]
* ('a'...'e').to_a #=> ["a", "b", "c", "d"]
*
* Ranges can be constructed using objects of any type, as long as the
* objects can be compared using their <code><=></code> operator and
* they support the <code>succ</code> method to return the next object
* in sequence.
*
* class Xs # represent a string of 'x's
* include Comparable
* attr :length
* def initialize(n)
* @length = n
* end
* def succ
* Xs.new(@length + 1)
* end
* def <=>(other)
* @length <=> other.length
* end
* def to_s
* sprintf "%2d #{inspect}", @length
* end
* def inspect
* 'x' * @length
* end
* end
*
* r = Xs.new(3)..Xs.new(6) #=> xxx..xxxxxx
* r.to_a #=> [xxx, xxxx, xxxxx, xxxxxx]
* r.member?(Xs.new(5)) #=> true
*
* In the previous code example, class <code>Xs</code> includes the
* <code>Comparable</code> module. This is because
* <code>Enumerable#member?</code> checks for equality using
* <code>==</code>. Including <code>Comparable</code> ensures that the
* <code>==</code> method is defined in terms of the <code><=></code>
* method implemented in <code>Xs</code>.
*
*/

void
Init_Range()
{
Expand Down

0 comments on commit 8983f9e

Please sign in to comment.