1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

RDoc comments for Fixnum, Float, and Hash. Add heuristic to RDoc to handle yaml/stringio

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5265 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
dave 2003-12-23 16:21:17 +00:00
parent fd4a3ee4ac
commit a3ecd5c83d
3 changed files with 1174 additions and 1 deletions

583
hash.c
View file

@ -195,6 +195,41 @@ rb_hash_new()
return hash_alloc(rb_cHash);
}
/*
* call-seq:
* Hash.new => hash
* Hash.new(obj) => aHash
* Hash.new {|hash, key| block } => aHash
*
* Returns a new, empty hash. If this hash is subsequently accessed by
* a key that doesn't correspond to a hash entry, the value returned
* depends on the style of <code>new</code> used to create the hash. In
* the first form, the access returns <code>nil</code>. If
* <i>obj</i> is specified, this single object will be used for
* all <em>default values</em>. If a block is specified, it will be
* called with the hash object and the key, and should return the
* default value. It is the block's responsibility to store the value
* in the hash if required.
*
* h = Hash.new("Go Fish")
* h["a"] = 100
* h["b"] = 200
* h["a"] #=> 100
* h["c"] #=> "Go Fish"
* # The following alters the single default object
* h["c"].upcase! #=> "GO FISH"
* h["d"] #=> "GO FISH"
* h.keys #=> ["a", "b"]
*
* # While this creates a new default object each time
* h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" }
* h["c"] #=> "Go Fish: c"
* h["c"].upcase! #=> "GO FISH: C"
* h["d"] #=> "Go Fish: d"
* h.keys #=> ["c", "d"]
*
*/
static VALUE
rb_hash_initialize(argc, argv, hash)
int argc;
@ -219,6 +254,19 @@ rb_hash_initialize(argc, argv, hash)
return hash;
}
/*
* call-seq:
* Hash[ [key =>|, value]* ] => hash
*
* Creates a new hash populated with the given objects. Equivalent to
* the literal <code>{ <i>key</i>, <i>value</i>, ... }</code>. Keys and
* values occur in pairs, so there must be an even number of arguments.
*
* Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
* Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
* { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
*/
static VALUE
rb_hash_s_create(argc, argv, klass)
int argc;
@ -265,6 +313,26 @@ rb_hash_rehash_i(key, value, tbl)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.rehash -> hsh
*
* Rebuilds the hash based on the current hash values for each key. If
* values of key objects have changed since they were inserted, this
* method will reindex <i>hsh</i>. If <code>Hash#rehash</code> is
* called while an iterator is traversing the hash, an
* <code>IndexError</code> will be raised in the iterator.
*
* a = [ "a", "b" ]
* c = [ "c", "d" ]
* h = { a => 100, c => 300 }
* h[a] #=> 100
* a[0] = "z"
* h[a] #=> nil
* h.rehash #=> {["z", "b"]=>100, ["c", "d"]=>300}
* h[a] #=> 100
*/
static VALUE
rb_hash_rehash(hash)
VALUE hash;
@ -280,6 +348,20 @@ rb_hash_rehash(hash)
return hash;
}
/*
* call-seq:
* hsh[key] => value
*
* Element Reference---Retrieves the <i>value</i> object corresponding
* to the <i>key</i> object. If not found, returns the a default value (see
* <code>Hash::new</code> for details).
*
* h = { "a" => 100, "b" => 200 }
* h["a"] #=> 100
* h["c"] #=> nil
*
*/
VALUE
rb_hash_aref(hash, key)
VALUE hash, key;
@ -292,6 +374,35 @@ rb_hash_aref(hash, key)
return val;
}
/*
* call-seq:
* hsh.fetch(key [, default] ) => obj
* hsh.fetch(key) {| key | block } => obj
*
* Returns a value from the hash for the given key. If the key can't be
* found, there are several options: With no other arguments, it will
* raise an <code>IndexError</code> exception; if <i>default</i> is
* given, then that will be returned; if the optional code block is
* specified, then that will be run and its result returned.
*
* h = { "a" => 100, "b" => 200 }
* h.fetch("a") #=> 100
* h.fetch("z", "go fish") #=> "go fish"
* h.fetch("z") { |el| "go fish, #{el}"} #=> "go fish, z"
*
* The following example shows that an exception is raised if the key
* is not found and a default value is not supplied.
*
* h = { "a" => 100, "b" => 200 }
* h.fetch("z")
*
* <em>produces:</em>
*
* prog.rb:2:in `fetch': key not found (IndexError)
* from prog.rb:2
*
*/
static VALUE
rb_hash_fetch(argc, argv, hash)
int argc;
@ -318,6 +429,27 @@ rb_hash_fetch(argc, argv, hash)
return val;
}
/*
* call-seq:
* hsh.default(key=nil) => obj
*
* Returns the default value, the value that would be returned by
* <i>hsh</i>[<i>key</i>] if <i>key</i> did not exist in <i>hsh</i>.
* See also <code>Hash::new</code> and <code>Hash#default=</code>.
*
* h = Hash.new #=> {}
* h.default #=> nil
* h.default(2) #=> nil
*
* h = Hash.new("cat") #=> {}
* h.default #=> "cat"
* h.default(2) #=> "cat"
*
* h = Hash.new {|h,k| h[k] = k.to_i*10} #=> {}
* h.default #=> 0
* h.default(2) #=> 20
*/
static VALUE
rb_hash_default(argc, argv, hash)
int argc;
@ -333,6 +465,26 @@ rb_hash_default(argc, argv, hash)
return RHASH(hash)->ifnone;
}
/*
* call-seq:
* hsh.default = obj => hsh
*
* Sets the default value, the value returned for a key that does not
* exist in the hash. It is not possible to set the a default to a
* <code>Proc</code> that will be executed on each key lookup.
*
* h = { "a" => 100, "b" => 200 }
* h.default = "Go fish"
* h["a"] #=> 100
* h["z"] #=> "Go fish"
* # This doesn't do what you might hope...
* h.default = proc do |hash, key|
* hash[key] = key + key
* end
* h[2] #=> #<Proc:0x401b3948@-:6>
* h["cat"] #=> #<Proc:0x401b3948@-:6>
*/
static VALUE
rb_hash_set_default(hash, ifnone)
VALUE hash, ifnone;
@ -343,6 +495,21 @@ rb_hash_set_default(hash, ifnone)
return ifnone;
}
/*
* call-seq:
* hsh.default_proc -> anObject
*
* If <code>Hash::new</code> was invoked with a block, return that
* block, otherwise return <code>nil</code>.
*
* h = Hash.new {|h,k| h[k] = k*k } #=> {}
* p = h.default_proc #=> #<Proc:0x401b3d08@-:1>
* a = [] #=> []
* p.call(a, 2)
* a #=> [nil, nil, 4]
*/
static VALUE
rb_hash_default_proc(hash)
VALUE hash;
@ -365,6 +532,18 @@ index_i(key, value, args)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.index(value) => key
*
* Returns the key for a given value. If not found, returns <code>nil</code>.
*
* h = { "a" => 100, "b" => 200 }
* h.index(200) #=> "b"
* h.index(999) #=> nil
*
*/
static VALUE
rb_hash_index(hash, value)
VALUE hash, value;
@ -379,6 +558,15 @@ rb_hash_index(hash, value)
return args[1];
}
/*
* call-seq:
* hsh.indexes(key, ...) => array
* hsh.indices(key, ...) => array
*
* Deprecated in favor of <code>Hash#select</code>.
*
*/
static VALUE
rb_hash_indexes(argc, argv, hash)
int argc;
@ -398,6 +586,24 @@ rb_hash_indexes(argc, argv, hash)
return indexes;
}
/*
* call-seq:
* hsh.delete(key) => value
* hsh.delete(key) {| key | block } => value
*
* Deletes and returns a key-value pair from <i>hsh</i> whose key is
* equal to <i>key</i>. If the key is not found, returns the
* <em>default value</em>. If the optional code block is given and the
* key is not found, pass in the key and return the result of
* <i>block</i>.
*
* h = { "a" => 100, "b" => 200 }
* h.delete("a") #=> 100
* h.delete("z") #=> nil
* h.delete("z") { |el| "#{el} not found" } #=> "z not found"
*
*/
VALUE
rb_hash_delete(hash, key)
VALUE hash, key;
@ -438,6 +644,19 @@ shift_i(key, value, var)
return ST_DELETE;
}
/*
* call-seq:
* hsh.shift -> anArray or obj
*
* Removes a key-value pair from <i>hsh</i> and returns it as the
* two-item array <code>[</code> <i>key, value</i> <code>]</code>, or
* the hash's default value if the hash is empty.
*
* h = { 1 => "a", 2 => "b", 3 => "c" }
* h.shift #=> [1, "a"]
* h #=> {2=>"b", 3=>"c"}
*/
static VALUE
rb_hash_shift(hash)
VALUE hash;
@ -469,6 +688,18 @@ delete_if_i(key, value)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.delete_if {| key, value | block } -> hsh
*
* Deletes every key-value pair from <i>hsh</i> for which <i>block</i>
* evaluates to <code>true</code>.
*
* h = { "a" => 100, "b" => 200, "c" => 300 }
* h.delete_if {|key, value| key >= "b" } #=> {"a"=>100}
*
*/
VALUE
rb_hash_delete_if(hash)
VALUE hash;
@ -478,6 +709,14 @@ rb_hash_delete_if(hash)
return hash;
}
/*
* call-seq:
* hsh.reject! {| key, value | block } -> hsh or nil
*
* Equivalent to <code>Hash#delete_if</code>, but returns
* <code>nil</code> if no changes were made.
*/
VALUE
rb_hash_reject_bang(hash)
VALUE hash;
@ -488,6 +727,16 @@ rb_hash_reject_bang(hash)
return hash;
}
/*
* call-seq:
* hsh.reject {| key, value | block } -> a_hash
*
* Same as <code>Hash#delete_if</code>, but works on (and returns) a
* copy of the <i>hsh</i>. Equivalent to
* <code><i>hsh</i>.dup.delete_if</code>.
*
*/
static VALUE
rb_hash_reject(hash)
VALUE hash;
@ -505,6 +754,17 @@ select_i(key, value, result)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.values_at(key, ...) => array
*
* Return an array containing the values associated with the given keys.
* Also see <code>Hash.select</code>.
*
* h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
* h.values_at("cow", "cat") #=> ["bovine", "feline"]
*/
VALUE
rb_hash_values_at(argc, argv, hash)
int argc;
@ -520,6 +780,19 @@ rb_hash_values_at(argc, argv, hash)
return result;
}
/*
* call-seq:
* hsh.select {|key, value| block} => array
*
* Returns a new array consisting of <code>[key,value]</code>
* pairs for which the block returns true.
* Also see <code>Hash.values_at</code>.
*
* h = { "a" => 100, "b" => 200, "c" => 300 }
* h.select {|k,v| k > "a"} #=> [["b", 200], ["c", 300]]
* h.select {|k,v| v < 200} #=> [["a", 100]]
*/
VALUE
rb_hash_select(argc, argv, hash)
int argc;
@ -543,6 +816,17 @@ clear_i(key, value, dummy)
return ST_DELETE;
}
/*
* call-seq:
* hsh.clear -> hsh
*
* Removes all key-value pairs from <i>hsh</i>.
*
* h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
* h.clear #=> {}
*
*/
static VALUE
rb_hash_clear(hash)
VALUE hash;
@ -553,6 +837,24 @@ rb_hash_clear(hash)
return hash;
}
/*
* call-seq:
* hsh[key] = value => value
* hsh.store(key, value) => value
*
* Element Assignment---Associates the value given by
* <i>value</i> with the key given by <i>key</i>.
* <i>key</i> should not have its value changed while it is in
* use as a key (a <code>String</code> passed as a key will be
* duplicated and frozen).
*
* h = { "a" => 100, "b" => 200 }
* h["a"] = 9
* h["c"] = 4
* h #=> {"a"=>9, "b"=>200, "c"=>4}
*
*/
VALUE
rb_hash_aset(hash, key, val)
VALUE hash, key, val;
@ -578,6 +880,18 @@ replace_i(key, val, hash)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.replace(other_hash) -> hsh
*
* Replaces the contents of <i>hsh</i> with the contents of
* <i>other_hash</i>.
*
* h = { "a" => 100, "b" => 200 }
* h.replace({ "c" => 300, "d" => 400 }) #=> {"c"=>300, "d"=>400}
*
*/
static VALUE
rb_hash_replace(hash, hash2)
VALUE hash, hash2;
@ -597,6 +911,19 @@ rb_hash_replace(hash, hash2)
return hash;
}
/*
* call-seq:
* hsh.length => fixnum
* hsh.size => fixnum
*
* Returns the number of key-value pairs in the hash.
*
* h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
* h.length #=> 4
* h.delete("a") #=> 200
* h.length #=> 3
*/
static VALUE
rb_hash_size(hash)
VALUE hash;
@ -604,6 +931,17 @@ rb_hash_size(hash)
return INT2FIX(RHASH(hash)->tbl->num_entries);
}
/*
* call-seq:
* hsh.empty? => true or false
*
* Returns <code>true</code> if <i>hsh</i> contains no key-value pairs.
*
* {}.empty? #=> true
*
*/
static VALUE
rb_hash_empty_p(hash)
VALUE hash;
@ -622,6 +960,22 @@ each_value_i(key, value)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.each_value {| value | block } -> hsh
*
* Calls <i>block</i> once for each key in <i>hsh</i>, passing the
* value as a parameter.
*
* h = { "a" => 100, "b" => 200 }
* h.each_value {|value| puts value }
*
* <em>produces:</em>
*
* 100
* 200
*/
static VALUE
rb_hash_each_value(hash)
VALUE hash;
@ -639,6 +993,21 @@ each_key_i(key, value)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.each_key {| key | block } -> hsh
*
* Calls <i>block</i> once for each key in <i>hsh</i>, passing the key
* as a parameter.
*
* h = { "a" => 100, "b" => 200 }
* h.each_key {|key| puts key }
*
* <em>produces:</em>
*
* a
* b
*/
static VALUE
rb_hash_each_key(hash)
VALUE hash;
@ -656,6 +1025,23 @@ each_pair_i(key, value)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.each_pair {| key_value_array | block } -> hsh
*
* Calls <i>block</i> once for each key in <i>hsh</i>, passing the key
* and value as parameters.
*
* h = { "a" => 100, "b" => 200 }
* h.each_pair {|key, value| puts "#{key} is #{value}" }
*
* <em>produces:</em>
*
* a is 100
* b is 200
*
*/
static VALUE
rb_hash_each_pair(hash)
VALUE hash;
@ -673,6 +1059,26 @@ each_i(key, value)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.each {| key, value | block } -> hsh
*
* Calls <i>block</i> once for each key in <i>hsh</i>, passing the key
* and value to the block as a two-element array. Because of the assignment
* semantics of block parameters, these elements will be split out if the
* block has two formal parameters. Also see <code>Hash.each_pair</code>, which
* will be marginally more efficient for blocks with two parameters.
*
* h = { "a" => 100, "b" => 200 }
* h.each {|key, value| puts "#{key} is #{value}" }
*
* <em>produces:</em>
*
* a is 100
* b is 200
*
*/
static VALUE
rb_hash_each(hash)
VALUE hash;
@ -690,6 +1096,17 @@ to_a_i(key, value, ary)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.to_a -> array
*
* Converts <i>hsh</i> to a nested array of <code>[</code> <i>key,
* value</i> <code>]</code> arrays.
*
* h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
* h.to_a #=> [["a", 100], ["c", 300], ["d", 400]]
*/
static VALUE
rb_hash_to_a(hash)
VALUE hash;
@ -703,6 +1120,21 @@ rb_hash_to_a(hash)
return ary;
}
/*
* call-seq:
* hsh.sort => array
* hsh.sort {| a, b | block } => array
*
* Converts <i>hsh</i> to a nested array of <code>[</code> <i>key,
* value</i> <code>]</code> arrays and sorts it, using
* <code>Array#sort</code>.
*
* h = { "a" => 20, "b" => 30, "c" => 10 }
* h.sort #=> [["a", 20], ["b", 30], ["c", 10]]
* h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]]
*
*/
static VALUE
rb_hash_sort(hash)
VALUE hash;
@ -747,6 +1179,13 @@ inspect_hash(hash)
return str;
}
/*
* call-seq:
* hsh.inspect => string
*
* Return the contents of this hash as a string.
*/
static VALUE
rb_hash_inspect(hash)
VALUE hash;
@ -764,6 +1203,19 @@ to_s_hash(hash)
return rb_ary_to_s(rb_hash_to_a(hash));
}
/*
* call-seq:
* hsh.to_s => string
*
* Converts <i>hsh</i> to a string by converting the hash to an array
* of <code>[</code> <i>key, value</i> <code>]</code> pairs and then
* converting that array to a string using <code>Array#join</code> with
* the default separator.
*
* h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
* h.to_s #=> "a100c300d400"
*/
static VALUE
rb_hash_to_s(hash)
VALUE hash;
@ -772,6 +1224,13 @@ rb_hash_to_s(hash)
return rb_protect_inspect(to_s_hash, hash, 0);
}
/*
* call-seq:
* hsh.to_hash => hsh
*
* Returns <i>self</i>.
*/
static VALUE
rb_hash_to_hash(hash)
VALUE hash;
@ -788,6 +1247,18 @@ keys_i(key, value, ary)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.keys => array
*
* Returns a new array populated with the keys from this hash. See also
* <code>Hash#values</code>.
*
* h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
* h.keys #=> ["a", "b", "c", "d"]
*
*/
static VALUE
rb_hash_keys(hash)
VALUE hash;
@ -809,6 +1280,18 @@ values_i(key, value, ary)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.values => array
*
* Returns a new array populated with the values from <i>hsh</i>. See
* also <code>Hash#keys</code>.
*
* h = { "a" => 100, "b" => 200, "c" => 300 }
* h.values #=> [100, 200, 300]
*
*/
static VALUE
rb_hash_values(hash)
VALUE hash;
@ -821,6 +1304,21 @@ rb_hash_values(hash)
return ary;
}
/*
* call-seq:
* hsh.has_key?(key) => true or false
* hsh.include?(key) => true or false
* hsh.key?(key) => true or false
* hsh.member?(key) => true or false
*
* Returns <code>true</code> if the given key is present in <i>hsh</i>.
*
* h = { "a" => 100, "b" => 200 }
* h.has_key?("a") #=> true
* h.has_key?("z") #=> false
*
*/
static VALUE
rb_hash_has_key(hash, key)
VALUE hash;
@ -844,6 +1342,19 @@ rb_hash_search_value(key, value, data)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.has_value?(value) => true or false
* hsh.value?(value) => true or false
*
* Returns <code>true</code> if the given value is present for some key
* in <i>hsh</i>.
*
* h = { "a" => 100, "b" => 200 }
* h.has_value?(100) #=> true
* h.has_value?(999) #=> false
*/
static VALUE
rb_hash_has_value(hash, val)
VALUE hash;
@ -881,6 +1392,25 @@ equal_i(key, val1, data)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh == other_hash => true or false
*
* Equality---Two hashes are equal if they each contain the same number
* of keys and if each key-value pair is equal to (according to
* <code>Object#==</code>) the corresponding elements in the other
* hash.
*
* h1 = { "a" => 1, "c" => 2 }
* h2 = { 7 => 35, "c" => 2, "a" => 1 }
* h3 = { "a" => 1, "c" => 2, 7 => 35 }
* h4 = { "a" => 1, "d" => 2, "f" => 35 }
* h1 == h2 #=> false
* h2 == h3 #=> true
* h3 == h4 #=> false
*
*/
static VALUE
rb_hash_equal(hash1, hash2)
VALUE hash1, hash2;
@ -917,6 +1447,18 @@ rb_hash_invert_i(key, value, hash)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.invert -> aHash
*
* Returns a new hash created by using <i>hsh</i>'s values as keys, and
* the keys as values.
*
* h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
* h.invert #=> {0=>"a", 100=>"n", 200=>"d", 300=>"y"}
*
*/
static VALUE
rb_hash_invert(hash)
VALUE hash;
@ -950,6 +1492,19 @@ rb_hash_update_block_i(key, value, hash)
return ST_CONTINUE;
}
/*
* call-seq:
* hsh.merge!(other_hash) => hsh
* hsh.update(other_hash) => hsh
*
* Adds the contents of <i>other_hash</i> to <i>hsh</i>, overwriting
* entries with duplicate keys with those from <i>other_hash</i>.
*
* h1 = { "a" => 100, "b" => 200 }
* h2 = { "b" => 254, "c" => 300 }
* h1.merge!(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
*/
static VALUE
rb_hash_update(hash1, hash2)
VALUE hash1, hash2;
@ -964,6 +1519,21 @@ rb_hash_update(hash1, hash2)
return hash1;
}
/*
* call-seq:
* hsh.merge(other_hash) -> a_hash
*
* Returns a new hash containing the contents of <i>other_hash</i> and
* the contents of <i>hsh</i>, overwriting entries in <i>hsh</i> with
* duplicate keys with those from <i>other_hash</i>.
*
* h1 = { "a" => 100, "b" => 200 }
* h2 = { "b" => 254, "c" => 300 }
* h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
* h1 #=> {"a"=>100, "b"=>200}
*
*/
static VALUE
rb_hash_merge(hash1, hash2)
VALUE hash1, hash2;
@ -1762,6 +2332,19 @@ env_update(env, hash)
return env;
}
/*
* A <code>Hash</code> is a collection of key-value pairs. It is
* similar to an <code>Array</code>, except that indexing is done via
* arbitrary keys of any object type, not an integer index. The order
* in which you traverse a hash by either key or value may seem
* arbitrary, and will generally not be in the insertion order.
*
* Hashes have a <em>default value</em> that is returned when accessing
* keys that do not exist in the hash. By default, that value is
* <code>nil</code>.
*
*/
void
Init_Hash()
{

View file

@ -1879,9 +1879,11 @@ module RDoc
name = name_t2.name
when TkCONSTANT
name = name_t2.name
prev_container = container
container = container.find_module_named(name_t.name)
if !container
error("Couldn't find module #{name_t.name}")
warn("Couldn't find #{name_t.name}. Assuming it's a module")
container = prev_container.add_module(NormalModule, name_t.name)
end
else
# warn("Unexpected token '#{name_t2.inspect}'")

588
numeric.c
View file

@ -291,6 +291,15 @@ num_to_int(num)
return rb_funcall(num, id_to_i, 0, 0);
}
/********************************************************************
*
* Document-class: Float
*
* <code>Float</code> objects represent real numbers using the native
* architecture's double-precision floating point representation.
*/
VALUE
rb_float_new(d)
double d;
@ -302,6 +311,16 @@ rb_float_new(d)
return (VALUE)flt;
}
/*
* call-seq:
* flt.to_s => string
*
* Returns a string containing a representation of self. As well as a
* fixed or exponential form of the number, the call may return
* ``<code>NaN</code>'', ``<code>Infinity</code>'', and
* ``<code>-Infinity</code>''.
*/
static VALUE
flo_to_s(flt)
VALUE flt;
@ -341,6 +360,10 @@ flo_to_s(flt)
return rb_str_new2(buf);
}
/*
* MISSING: documentation
*/
static VALUE
flo_coerce(x, y)
VALUE x, y;
@ -348,6 +371,13 @@ flo_coerce(x, y)
return rb_assoc_new(rb_Float(y), x);
}
/*
* call-seq:
* -float => float
*
* Returns float, negated.
*/
static VALUE
flo_uminus(flt)
VALUE flt;
@ -355,6 +385,14 @@ flo_uminus(flt)
return rb_float_new(-RFLOAT(flt)->value);
}
/*
* call-seq:
* float + other => float
*
* Returns a new float which is the sum of <code>float</code>
* and <code>other</code>.
*/
static VALUE
flo_plus(x, y)
VALUE x, y;
@ -371,6 +409,14 @@ flo_plus(x, y)
}
}
/*
* call-seq:
* float + other => float
*
* Returns a new float which is the difference of <code>float</code>
* and <code>other</code>.
*/
static VALUE
flo_minus(x, y)
VALUE x, y;
@ -387,6 +433,14 @@ flo_minus(x, y)
}
}
/*
* call-seq:
* float * other => float
*
* Returns a new float with is the product of <code>float</code>
* and <code>other</code>.
*/
static VALUE
flo_mul(x, y)
VALUE x, y;
@ -403,6 +457,14 @@ flo_mul(x, y)
}
}
/*
* call-seq:
* float / other => float
*
* Returns a new float which is the result of dividing
* <code>float</code> by <code>other</code>.
*/
static VALUE
flo_div(x, y)
VALUE x, y;
@ -424,6 +486,7 @@ flo_div(x, y)
}
}
static void
flodivmod(x, y, divp, modp)
double x, y;
@ -450,6 +513,18 @@ flodivmod(x, y, divp, modp)
if (divp) *divp = div;
}
/*
* call-seq:
* flt % other => float
* flt.modulo(other) => float
*
* Return the modulo after dividion of <code>flt</code> by <code>other</code>.
*
* 6543.21.modulo(137) #=> 104.21
* 6543.21.modulo(137.24) #=> 92.9299999999996
*/
static VALUE
flo_mod(x, y)
VALUE x, y;
@ -473,6 +548,13 @@ flo_mod(x, y)
return rb_float_new(mod);
}
/*
* call-seq:
* flt.divmod(numeric) => array
*
* See <code>Numeric#divmod</code>.
*/
static VALUE
flo_divmod(x, y)
VALUE x, y;
@ -496,6 +578,14 @@ flo_divmod(x, y)
return rb_assoc_new(rb_float_new(div), rb_float_new(mod));
}
/*
* call-seq:
*
* flt ** other => float
*
* Raises <code>float</code> the <code>other</code> power.
*/
static VALUE
flo_pow(x, y)
VALUE x, y;
@ -537,6 +627,18 @@ num_equal(x, y)
return rb_funcall(y, id_eq, 1, x);
}
/*
* call-seq:
* flt == obj => true or false
*
* Returns <code>true</code> only if <i>obj</i> has the same value
* as <i>flt</i>. Contrast this with <code>Float#eql?</code>, which
* requires <i>obj</i> to be a <code>Float</code>.
*
* 1.0 == 1 #=> true
*
*/
static VALUE
flo_eq(x, y)
VALUE x, y;
@ -561,6 +663,13 @@ flo_eq(x, y)
return (a == b)?Qtrue:Qfalse;
}
/*
* call-seq:
* flt.hash => integer
*
* Returns a hash code for this float.
*/
static VALUE
flo_hash(num)
VALUE num;
@ -590,6 +699,15 @@ rb_dbl_cmp(a, b)
return Qnil;
}
/*
* call-seq:
* flt <=> numeric => -1, 0, +1
*
* Returns -1, 0, or +1 depending on whether <i>flt</i> is less than,
* equal to, or greater than <i>numeric</i>. This is the basis for the
* tests in <code>Comparable</code>.
*/
static VALUE
flo_cmp(x, y)
VALUE x, y;
@ -616,6 +734,13 @@ flo_cmp(x, y)
return rb_dbl_cmp(a, b);
}
/*
* call-seq:
* flt > other => true or false
*
* <code>true</code> if <code>flt</code> is greater than <code>other</code>.
*/
static VALUE
flo_gt(x, y)
VALUE x, y;
@ -643,6 +768,14 @@ flo_gt(x, y)
return (a > b)?Qtrue:Qfalse;
}
/*
* call-seq:
* flt >= other => true or false
*
* <code>true</code> if <code>flt</code> is greater than
* or equal to <code>other</code>.
*/
static VALUE
flo_ge(x, y)
VALUE x, y;
@ -670,6 +803,13 @@ flo_ge(x, y)
return (a >= b)?Qtrue:Qfalse;
}
/*
* call-seq:
* flt < other => true or false
*
* <code>true</code> if <code>flt</code> is less than <code>other</code>.
*/
static VALUE
flo_lt(x, y)
VALUE x, y;
@ -697,6 +837,14 @@ flo_lt(x, y)
return (a < b)?Qtrue:Qfalse;
}
/*
* call-seq:
* flt <= other => true or false
*
* <code>true</code> if <code>flt</code> is less than
* or equal to <code>other</code>.
*/
static VALUE
flo_le(x, y)
VALUE x, y;
@ -724,6 +872,17 @@ flo_le(x, y)
return (a <= b)?Qtrue:Qfalse;
}
/*
* call-seq:
* flt.eql?(obj) => true or false
*
* Returns <code>true</code> only if <i>obj</i> is a
* <code>Float</code> with the same value as <i>flt</i>. Contrast this
* with <code>Float#==</code>, which performs type conversions.
*
* 1.0.eql?(1) #=> false
*/
static VALUE
flo_eql(x, y)
VALUE x, y;
@ -738,6 +897,13 @@ flo_eql(x, y)
return Qfalse;
}
/*
* call-seq:
* flt.to_f => flt
*
* As <code>flt</code> is already a float, returns <i>self</i>.
*/
static VALUE
flo_to_f(num)
VALUE num;
@ -745,6 +911,17 @@ flo_to_f(num)
return num;
}
/*
* call-seq:
* flt.abs => float
*
* Returns the absolute value of <i>flt</i>.
*
* (-34.56).abs #=> 34.56
* -34.56.abs #=> 34.56
*
*/
static VALUE
flo_abs(flt)
VALUE flt;
@ -753,6 +930,14 @@ flo_abs(flt)
return rb_float_new(val);
}
/*
* call-seq:
* flt.zero? -> true or false
*
* Returns <code>true</code> if <i>flt</i> is 0.0.
*
*/
static VALUE
flo_zero_p(num)
VALUE num;
@ -763,6 +948,19 @@ flo_zero_p(num)
return Qfalse;
}
/*
* call-seq:
* flt.nan? -> true or false
*
* Returns <code>true</code> if <i>flt</i> is an invalid IEEE floating
* point number.
*
* a = -1.0 #=> -1.0
* a.nan? #=> false
* a = 0.0/0.0 #=> NaN
* a.nan? #=> true
*/
static VALUE
flo_is_nan_p(num)
VALUE num;
@ -772,6 +970,18 @@ flo_is_nan_p(num)
return isnan(value) ? Qtrue : Qfalse;
}
/*
* call-seq:
* flt.infinite? -> nil, -1, +1
*
* Returns <code>nil</code>, -1, or +1 depending on whether <i>flt</i>
* is finite, -infinity, or +infinity.
*
* (0.0).infinite? #=> nil
* (-1.0/0.0).infinite? #=> -1
* (+1.0/0.0).infinite? #=> 1
*/
static VALUE
flo_is_infinite_p(num)
VALUE num;
@ -785,6 +995,16 @@ flo_is_infinite_p(num)
return Qnil;
}
/*
* call-seq:
* flt.finite? -> true or false
*
* Returns <code>true</code> if <i>flt</i> is a valid IEEE floating
* point number (it is not infinite, and <code>nan?</code> is
* <code>false</code>).
*
*/
static VALUE
flo_is_finite_p(num)
VALUE num;
@ -802,6 +1022,18 @@ flo_is_finite_p(num)
return Qtrue;
}
/*
* call-seq:
* flt.floor => integer
*
* Returns the largest integer less than or equal to <i>flt</i>.
*
* 1.2.floor #=> 1
* 2.0.floor #=> 2
* (-1.2).floor #=> -2
* (-2.0).floor #=> -2
*/
static VALUE
flo_floor(num)
VALUE num;
@ -816,6 +1048,19 @@ flo_floor(num)
return LONG2FIX(val);
}
/*
* call-seq:
* flt.ceil => integer
*
* Returns the smallest <code>Integer</code> greater than or equal to
* <i>flt</i>.
*
* 1.2.ceil #=> 2
* 2.0.ceil #=> 2
* (-1.2).ceil #=> -1
* (-2.0).ceil #=> -2
*/
static VALUE
flo_ceil(num)
VALUE num;
@ -830,6 +1075,23 @@ flo_ceil(num)
return LONG2FIX(val);
}
/*
* call-seq:
* flt.round => integer
*
* Rounds <i>flt</i> to the nearest integer. Equivalent to:
*
* def round
* return floor(self+0.5) if self > 0.0
* return ceil(self-0.5) if self < 0.0
* return 0.0
* end
*
* 1.5.round #=> 2
* (-1.5).round #=> -2
*
*/
static VALUE
flo_round(num)
VALUE num;
@ -847,6 +1109,15 @@ flo_round(num)
return LONG2FIX(val);
}
/*
* call-seq:
* flt.to_i => integer
* flt.to_int => integer
* flt.truncate => integer
*
* Returns <i>flt</i> truncated to an <code>Integer</code>.
*/
static VALUE
flo_truncate(num)
VALUE num;
@ -1218,6 +1489,33 @@ int_chr(num)
return rb_str_new(&c, 1);
}
/********************************************************************
*
* Document-class: Fixnum
*
* A <code>Fixnum</code> holds <code>Integer</code> values that can be
* represented in a native machine word (minus 1 bit). If any operation
* on a <code>Fixnum</code> exceeds this range, the value is
* automatically converted to a <code>Bignum</code>.
*
* <code>Fixnum</code> objects have immediate value. This means that
* when they are assigned or passed as parameters, the actual object is
* passed, rather than a reference to that object. Assignment does not
* alias <code>Fixnum</code> objects. There is effectively only one
* <code>Fixnum</code> object instance for any given integer value, so,
* for example, you cannot add a singleton method to a
* <code>Fixnum</code>.
*/
/*
* call-seq:
* Fixnum.induced_from(obj) => fixnum
*
* Convert <code>obj</code> to a Fixnum. Works with numeric parameters.
* Also works with Symbols, but this is deprecated.
*/
static VALUE
rb_fix_induced_from(klass, x)
VALUE klass, x;
@ -1225,6 +1523,13 @@ rb_fix_induced_from(klass, x)
return rb_num2fix(x);
}
/*
* call-seq:
* Integer.induced_from(obj) => fixnum, bignum
*
* Convert <code>obj</code> to an Integer.
*/
static VALUE
rb_int_induced_from(klass, x)
VALUE klass, x;
@ -1241,6 +1546,13 @@ rb_int_induced_from(klass, x)
}
}
/*
* call-seq:
* Float.induced_from(obj) => float
*
* Convert <code>obj</code> to a float.
*/
static VALUE
rb_flo_induced_from(klass, x)
VALUE klass, x;
@ -1257,6 +1569,13 @@ rb_flo_induced_from(klass, x)
}
}
/*
* call-seq:
* -fix => integer
*
* Negates <code>fix</code> (which might return a Bignum).
*/
static VALUE
fix_uminus(num)
VALUE num;
@ -1295,6 +1614,21 @@ rb_fix2str(x, base)
return rb_str_new2(b);
}
/*
* call-seq:
* fix.to_s( base=10 ) -> aString
*
* Returns a string containing the representation of <i>fix</i> radix
* <i>base</i> (between 2 and 36).
*
* 12345.to_s #=> "12345"
* 12345.to_s(2) #=> "11000000111001"
* 12345.to_s(8) #=> "30071"
* 12345.to_s(10) #=> "12345"
* 12345.to_s(16) #=> "3039"
* 12345.to_s(36) #=> "9ix"
*
*/
static VALUE
fix_to_s(argc, argv, x)
int argc;
@ -1315,6 +1649,15 @@ fix_to_s(argc, argv, x)
return rb_fix2str(x, base);
}
/*
* call-seq:
* fix + numeric => numeric_result
*
* Performs addition: the class of the resulting object depends on
* the class of <code>numeric</code> and on the magnitude of the
* result.
*/
static VALUE
fix_plus(x, y)
VALUE x, y;
@ -1339,6 +1682,15 @@ fix_plus(x, y)
return rb_num_coerce_bin(x, y);
}
/*
* call-seq:
* fix - numeric => numeric_result
*
* Performs subtraction: the class of the resulting object depends on
* the class of <code>numeric</code> and on the magnitude of the
* result.
*/
static VALUE
fix_minus(x, y)
VALUE x, y;
@ -1363,6 +1715,15 @@ fix_minus(x, y)
return rb_num_coerce_bin(x, y);
}
/*
* call-seq:
* fix * numeric => numeric_result
*
* Performs multiplication: the class of the resulting object depends on
* the class of <code>numeric</code> and on the magnitude of the
* result.
*/
static VALUE
fix_mul(x, y)
VALUE x, y;
@ -1418,6 +1779,18 @@ fixdivmod(x, y, divp, modp)
if (modp) *modp = mod;
}
/*
* call-seq:
* fix.quo(numeric) => float
*
* Returns the floating point result of dividing <i>fix</i> by
* <i>numeric</i>.
*
* 654321.quo(13731) #=> 47.6528293642124
* 654321.quo(13731.24) #=> 47.6519964693647
*
*/
static VALUE
fix_quo(x, y)
VALUE x, y;
@ -1428,6 +1801,16 @@ fix_quo(x, y)
return rb_num_coerce_bin(x, y);
}
/*
* call-seq:
* fix / numeric => numeric_result
* fix.div(numeric) => numeric_result
*
* Performs division: the class of the resulting object depends on
* the class of <code>numeric</code> and on the magnitude of the
* result.
*/
static VALUE
fix_div(x, y)
VALUE x, y;
@ -1441,6 +1824,15 @@ fix_div(x, y)
return rb_num_coerce_bin(x, y);
}
/*
* call-seq:
* fix % other => Numeric
* fix.modulo(other) => Numeric
*
* Returns <code>fix</code> modulo <code>other</code>.
* See <code>Numeric.divmod</code> for more information.
*/
static VALUE
fix_mod(x, y)
VALUE x, y;
@ -1454,6 +1846,12 @@ fix_mod(x, y)
return rb_num_coerce_bin(x, y);
}
/*
* call-seq:
* fix.divmod(numeric) => array
*
* See <code>Numeric#divmod</code>.
*/
static VALUE
fix_divmod(x, y)
VALUE x, y;
@ -1468,6 +1866,18 @@ fix_divmod(x, y)
return rb_num_coerce_bin(x, y);
}
/*
* call-seq:
* fix ** other => Numeric
*
* Raises <code>fix</code> to the <code>other</code> power, which may
* be negative or fractional.
*
* 2 ** 3 #=> 8
* 2 ** -1 #=> 0.5
* 2 ** 0.5 #=> 1.4142135623731
*/
static VALUE
fix_pow(x, y)
VALUE x, y;
@ -1487,6 +1897,17 @@ fix_pow(x, y)
return rb_num_coerce_bin(x, y);
}
/*
* call-seq:
* fix == other
*
* Return <code>true</code> if <code>fix</code> equals <code>other</code>
* numerically.
*
* 1 == 2 #=> false
* 1 == 1.0 #=> true
*/
static VALUE
fix_equal(x, y)
VALUE x, y;
@ -1499,6 +1920,15 @@ fix_equal(x, y)
}
}
/*
* call-seq:
* fix <=> numeric => -1, 0, +1
*
* Comparison---Returns -1, 0, or +1 depending on whether <i>fix</i> is
* less than, equal to, or greater than <i>numeric</i>. This is the
* basis for the tests in <code>Comparable</code>.
*/
static VALUE
fix_cmp(x, y)
VALUE x, y;
@ -1515,6 +1945,14 @@ fix_cmp(x, y)
}
}
/*
* call-seq:
* fix > other => true or false
*
* Returns <code>true</code> if the value of <code>fix</code> is
* greater than that of <code>other</code>.
*/
static VALUE
fix_gt(x, y)
VALUE x, y;
@ -1530,6 +1968,14 @@ fix_gt(x, y)
}
}
/*
* call-seq:
* fix >= other => true or false
*
* Returns <code>true</code> if the value of <code>fix</code> is
* greater than or equal to that of <code>other</code>.
*/
static VALUE
fix_ge(x, y)
VALUE x, y;
@ -1545,6 +1991,14 @@ fix_ge(x, y)
}
}
/*
* call-seq:
* fix < other => true or false
*
* Returns <code>true</code> if the value of <code>fix</code> is
* less than that of <code>other</code>.
*/
static VALUE
fix_lt(x, y)
VALUE x, y;
@ -1560,6 +2014,14 @@ fix_lt(x, y)
}
}
/*
* call-seq:
* fix <= other => true or false
*
* Returns <code>true</code> if the value of <code>fix</code> is
* less thanor equal to that of <code>other</code>.
*/
static VALUE
fix_le(x, y)
VALUE x, y;
@ -1575,6 +2037,13 @@ fix_le(x, y)
}
}
/*
* call-seq:
* ~fix => integer
*
* One's complement: returns a number where each bit is flipped.
*/
static VALUE
fix_rev(num)
VALUE num;
@ -1585,6 +2054,13 @@ fix_rev(num)
return LONG2NUM(val);
}
/*
* call-seq:
* fix & other => integer
*
* Bitwise AND.
*/
static VALUE
fix_and(x, y)
VALUE x, y;
@ -1598,6 +2074,13 @@ fix_and(x, y)
return LONG2NUM(val);
}
/*
* call-seq:
* fix | other => integer
*
* Bitwise OR.
*/
static VALUE
fix_or(x, y)
VALUE x, y;
@ -1611,6 +2094,13 @@ fix_or(x, y)
return LONG2NUM(val);
}
/*
* call-seq:
* fix ^ other => integer
*
* Bitwise EXCLUSIVE OR.
*/
static VALUE
fix_xor(x, y)
VALUE x, y;
@ -1626,6 +2116,13 @@ fix_xor(x, y)
static VALUE fix_rshift _((VALUE, VALUE));
/*
* call-seq:
* fix << count => integer
*
* Shifts _fix_ left _count_ positions (right if _count_ is negative).
*/
static VALUE
fix_lshift(x, y)
VALUE x, y;
@ -1644,6 +2141,13 @@ fix_lshift(x, y)
return LONG2NUM(val);
}
/*
* call-seq:
* fix >> count => integer
*
* Shifts _fix_ left _count_ positions (right if _count_ is negative).
*/
static VALUE
fix_rshift(x, y)
VALUE x, y;
@ -1663,6 +2167,22 @@ fix_rshift(x, y)
return LONG2FIX(val);
}
/*
* call-seq:
* fix[n] => 0, 1
*
* Bit Reference---Returns the <em>n</em>th bit in the binary
* representation of <i>fix</i>, where <i>fix</i>[0] is the least
* significant bit.
*
* a = 0b11001100101010
* 30.downto(0) do |n| print a[n] end
*
* <em>produces:</em>
*
* 0000000000000000011001100101010
*/
static VALUE
fix_aref(fix, idx)
VALUE fix, idx;
@ -1690,6 +2210,14 @@ fix_aref(fix, idx)
return INT2FIX(0);
}
/*
* call-seq:
* fix.to_f -> float
*
* Converts <i>fix</i> to a <code>Float</code>.
*
*/
static VALUE
fix_to_f(num)
VALUE num;
@ -1701,6 +2229,17 @@ fix_to_f(num)
return rb_float_new(val);
}
/*
* call-seq:
* fix.abs -> aFixnum
*
* Returns the absolute value of <i>fix</i>.
*
* -12345.abs #=> 12345
* 12345.abs #=> 12345
*
*/
static VALUE
fix_abs(fix)
VALUE fix;
@ -1712,6 +2251,21 @@ fix_abs(fix)
return LONG2NUM(i);
}
/*
* call-seq:
* fix.id2name -> string or nil
*
* Returns the name of the object whose symbol id is <i>fix</i>. If
* there is no symbol in the symbol table with this value, returns
* <code>nil</code>. <code>id2name</code> has nothing to do with the
* <code>Object.id</code> method. See also <code>Fixnum#to_sym</code>,
* <code>String#intern</code>, and class <code>Symbol</code>.
*
* symbol = :@inst_var #=> :@inst_var
* id = symbol.to_i #=> 9818
* id.id2name #=> "@inst_var"
*/
static VALUE
fix_id2name(fix)
VALUE fix;
@ -1721,6 +2275,19 @@ fix_id2name(fix)
return Qnil;
}
/*
* call-seq:
* fix.to_sym -> aSymbol
*
* Returns the symbol whose integer value is <i>fix</i>. See also
* <code>Fixnum#id2name</code>.
*
* fred = :fred.to_i
* fred.id2name #=> "fred"
* fred.to_sym #=> :fred
*/
static VALUE
fix_to_sym(fix)
VALUE fix;
@ -1733,6 +2300,19 @@ fix_to_sym(fix)
return Qnil;
}
/*
* call-seq:
* fix.size -> fixnum
*
* Returns the number of <em>bytes</em> in the machine representation
* of a <code>Fixnum</code>.
*
* 1.size #=> 4
* -1.size #=> 4
* 2147483647.size #=> 4
*/
static VALUE
fix_size(fix)
VALUE fix;
@ -1812,6 +2392,14 @@ int_dotimes(num)
return num;
}
/*
* call-seq:
* fix.zero? => true or false
*
* Returns <code>true</code> if <i>fix</i> is zero.
*
*/
static VALUE
fix_zero_p(num)
VALUE num;