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

* lib/set.rb: retire contain?() and add superset?(),

proper_superset?() subset?(), and proper_subset?().
  [obtained from: Jason Voegele's set.rb]

* lib/set.rb: define several aliases: union() for |(),
  difference() for -(), ande intersection() for &().
  [obtained from: Jason Voegele's set.rb]

* lib/set.rb: deal with a s/id/object_id/ leftover.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3038 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
knu 2002-11-09 18:52:04 +00:00
parent 237229e201
commit 2cfae9b60f
2 changed files with 140 additions and 17 deletions

View file

@ -1,3 +1,15 @@
Sun Nov 10 03:46:18 2002 Akinori MUSHA <knu@iDaemons.org>
* lib/set.rb: retire contain?() and add superset?(),
proper_superset?() subset?(), and proper_subset?().
[obtained from: Jason Voegele's set.rb]
* lib/set.rb: define several aliases: union() for |(),
difference() for -(), ande intersection() for &().
[obtained from: Jason Voegele's set.rb]
* lib/set.rb: deal with a s/id/object_id/ leftover.
Sat Nov 9 16:06:57 2002 WATANABE Hirofumi <eban@ruby-lang.org> Sat Nov 9 16:06:57 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* ext/tcltklib/stubs.c: should include "util.h" for ruby_strdup. * ext/tcltklib/stubs.c: should include "util.h" for ruby_strdup.

View file

@ -87,9 +87,19 @@ Object#eql? and Object#hash, since Set uses Hash as storage.
--- member?(o) --- member?(o)
Returns true if the set contains the given object. Returns true if the set contains the given object.
--- contain?(enum) --- superset?(set)
Returns true if the set contains every element of the given Returns true if the set is a superset of or is equal to the given
enumerable object. set.
--- proper_superset?(set)
Returns true if the set is a superset of or is equal to the given
set.
--- subset?(set)
Returns true if the set is a proper subset of the given set.
--- proper_subset?(set)
Returns true if the set is a proper subset of the given set.
--- each { |o| ... } --- each { |o| ... }
Calls the given block once for each element in the set, passing Calls the given block once for each element in the set, passing
@ -132,6 +142,7 @@ Object#eql? and Object#hash, since Set uses Hash as storage.
--- + enum --- + enum
--- | enum --- | enum
--- union(enum)
Returns a new set built by merging the set and the elements of the Returns a new set built by merging the set and the elements of the
given enumerable object. given enumerable object.
@ -140,6 +151,7 @@ Object#eql? and Object#hash, since Set uses Hash as storage.
element that appear in the given enumerable object. element that appear in the given enumerable object.
--- & enum --- & enum
--- intersection(enum)
Returns a new array containing elements common to the set and the Returns a new array containing elements common to the set and the
given enumerable object. given enumerable object.
@ -298,9 +310,28 @@ class Set
end end
alias member? include? alias member? include?
def contain?(enum) def superset?(set)
enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable" set.is_a?(Set) or raise ArgumentError, "value must be a set"
enum.all? { |o| include?(o) } return false if size < set.size
set.all? { |o| include?(o) }
end
def proper_superset?(set)
set.is_a?(Set) or raise ArgumentError, "value must be a set"
return false if size <= set.size
set.all? { |o| include?(o) }
end
def subset?(set)
set.is_a?(Set) or raise ArgumentError, "value must be a set"
return false if set.size < size
all? { |o| set.include?(o) }
end
def proper_subset?(set)
set.is_a?(Set) or raise ArgumentError, "value must be a set"
return false if set.size <= size
all? { |o| set.include?(o) }
end end
def each def each
@ -369,16 +400,18 @@ class Set
self self
end end
def +(enum) def |(enum)
enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable" enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
dup.merge(enum) dup.merge(enum)
end end
alias | + ## alias + | ##
alias union | ##
def -(enum) def -(enum)
enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable" enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
dup.subtract(enum) dup.subtract(enum)
end end
alias difference - ##
def &(enum) def &(enum)
enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable" enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
@ -386,6 +419,7 @@ class Set
enum.each { |o| include?(o) and n.add(o) } enum.each { |o| include?(o) and n.add(o) }
n n
end end
alias intersection & ##
def ^(enum) def ^(enum)
enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable" enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
@ -454,12 +488,12 @@ class Set
def inspect def inspect
ids = (Thread.current[InspectKey] ||= []) ids = (Thread.current[InspectKey] ||= [])
if ids.include?(id) if ids.include?(object_id)
return sprintf('#<%s: {...}>', self.class.name) return sprintf('#<%s: {...}>', self.class.name)
end end
begin begin
ids << id ids << object_id
return sprintf('#<%s: {%s}>', self.class, to_a.inspect[1..-2]) return sprintf('#<%s: {%s}>', self.class, to_a.inspect[1..-2])
ensure ensure
ids.pop ids.pop
@ -859,22 +893,99 @@ class TC_Set < Test::Unit::TestCase
assert_equal(false, set.include?(true)) assert_equal(false, set.include?(true))
end end
def test_contain? def test_superset?
set = Set[1,2,3] set = Set[1,2,3]
assert_raises(ArgumentError) { assert_raises(ArgumentError) {
set.contain?() set.superset?()
} }
assert_raises(ArgumentError) { assert_raises(ArgumentError) {
set.contain?(2) set.superset?(2)
} }
assert_equal(true, set.contain?([])) assert_raises(ArgumentError) {
assert_equal(true, set.contain?([3,1])) set.superset?([2])
assert_equal(false, set.contain?([1,2,0])) }
assert_equal(true, Set[].contain?([])) assert_equal(true, set.superset?(Set[]))
assert_equal(true, set.superset?(Set[1,2]))
assert_equal(true, set.superset?(Set[1,2,3]))
assert_equal(false, set.superset?(Set[1,2,3,4]))
assert_equal(false, set.superset?(Set[1,4]))
assert_equal(true, Set[].superset?(Set[]))
end
def test_proper_superset?
set = Set[1,2,3]
assert_raises(ArgumentError) {
set.proper_superset?()
}
assert_raises(ArgumentError) {
set.proper_superset?(2)
}
assert_raises(ArgumentError) {
set.proper_superset?([2])
}
assert_equal(true, set.proper_superset?(Set[]))
assert_equal(true, set.proper_superset?(Set[1,2]))
assert_equal(false, set.proper_superset?(Set[1,2,3]))
assert_equal(false, set.proper_superset?(Set[1,2,3,4]))
assert_equal(false, set.proper_superset?(Set[1,4]))
assert_equal(false, Set[].proper_superset?(Set[]))
end
def test_subset?
set = Set[1,2,3]
assert_raises(ArgumentError) {
set.subset?()
}
assert_raises(ArgumentError) {
set.subset?(2)
}
assert_raises(ArgumentError) {
set.subset?([2])
}
assert_equal(true, set.subset?(Set[1,2,3,4]))
assert_equal(true, set.subset?(Set[1,2,3]))
assert_equal(false, set.subset?(Set[1,2]))
assert_equal(false, set.subset?(Set[]))
assert_equal(true, Set[].subset?(Set[1]))
assert_equal(true, Set[].subset?(Set[]))
end
def test_proper_subset?
set = Set[1,2,3]
assert_raises(ArgumentError) {
set.proper_subset?()
}
assert_raises(ArgumentError) {
set.proper_subset?(2)
}
assert_raises(ArgumentError) {
set.proper_subset?([2])
}
assert_equal(true, set.proper_subset?(Set[1,2,3,4]))
assert_equal(false, set.proper_subset?(Set[1,2,3]))
assert_equal(false, set.proper_subset?(Set[1,2]))
assert_equal(false, set.proper_subset?(Set[]))
assert_equal(false, Set[].proper_subset?(Set[]))
end end
def test_each def test_each