aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/set.rb18
-rw-r--r--test/test_set.rb13
2 files changed, 31 insertions, 0 deletions
diff --git a/lib/set.rb b/lib/set.rb
index b668738ebb..5da196d1e0 100644
--- a/lib/set.rb
+++ b/lib/set.rb
@@ -477,6 +477,19 @@ class Set
@hash.eql?(o.instance_variable_get(:@hash))
end
+ # Resets the internal state after modification to existing elements
+ # and returns self.
+ #
+ # Elements will be reindexed and deduplicated.
+ def reset
+ if @hash.respond_to?(:rehash)
+ @hash.rehash # This should perform frozenness check.
+ else
+ raise "can't modify frozen #{self.class.name}" if frozen?
+ end
+ self
+ end
+
# Returns true if obj is a member of the set, and false otherwise.
#
# Used in case statements:
@@ -731,6 +744,11 @@ class SortedSet < Set
to_a
super
end
+
+ def rehash
+ @keys = nil
+ super
+ end
END
end
# a hack to shut up warning
diff --git a/test/test_set.rb b/test/test_set.rb
index 33802410af..37b781c5ca 100644
--- a/test/test_set.rb
+++ b/test/test_set.rb
@@ -761,6 +761,19 @@ class TC_Set < Test::Unit::TestCase
assert_equal(3, set.size)
assert_equal(array.uniq.sort, set.sort)
end
+
+ def test_reset
+ [Set, Class.new(Set)].each { |klass|
+ a = [1, 2]
+ b = [1]
+ set = klass.new([a, b])
+
+ b << 2
+ set.reset
+
+ assert_equal(klass.new([a]), set, klass.name)
+ }
+ end
end
class TC_SortedSet < Test::Unit::TestCase