mruby-set: move #replace to Ruby again

Since it does only clear() and merge(), there is little use of the C
implemented fast path. This change also reduce memory consumption.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-06-21 06:41:20 +09:00
parent 100ba913f2
commit 5e2a7568e2
2 changed files with 2 additions and 39 deletions
+2 -12
View File
@@ -36,15 +36,8 @@ class Set
# @param [Enumerable] enum The enumerable object to replace with
# @return [Set] self
def replace(enum)
if enum.is_a?(Set)
# Fast path: Call C-implemented function for Set-to-Set replace
__set_replace(enum)
else
# General path: Clear and add each element from the enumerable
clear
__do_with_enum(enum) { |o| add(o) }
self
end
clear
merge(enum)
end
# Deletes every element that appears in the given enumerable object and
@@ -152,7 +145,6 @@ class Set
end
}
seen.delete(set.object_id)
self
end
@@ -264,12 +256,10 @@ class Set
def classify
return to_enum :classify unless block_given?
h = {}
each { |i|
x = yield(i)
(h[x] ||= self.class.new).add(i)
}
h
end
-27
View File
@@ -360,32 +360,6 @@ set_delete_p(mrb_state *mrb, mrb_value self)
}
}
/*
* Core implementation of Set-to-Set replace
* This is an internal method that will be called from Ruby
*/
static mrb_value
set_core_replace(mrb_state *mrb, mrb_value self)
{
mrb_value other = mrb_get_arg1(mrb);
/* Clear the current set */
set_clear(mrb, self);
khash_t(set) *self_kh = set_get_khash(mrb, self);
if (!self_kh) {
/* If self is empty after clearing, create a new hash */
self_kh = kh_init(set, mrb);
set_set_khash(mrb, self, self_kh);
}
/* Add all elements from other set */
khash_t(set) *other_kh = set_get_khash(mrb, other);
set_copy_elements(mrb, self_kh, other_kh);
return self;
}
/*
* Core implementation of Set-to-Set merge (mutating version)
* This is an internal method that will be called from Ruby
@@ -924,7 +898,6 @@ mrb_mruby_set_gem_init(mrb_state *mrb)
mrb_define_method(mrb, set, "delete", set_delete, MRB_ARGS_REQ(1));
mrb_define_method(mrb, set, "delete?", set_delete_p, MRB_ARGS_REQ(1));
mrb_define_method(mrb, set, "__set_replace", set_core_replace, MRB_ARGS_REQ(1));
mrb_define_method(mrb, set, "__set_merge", set_core_merge, MRB_ARGS_REQ(1));
mrb_define_method(mrb, set, "__set_subtract", set_core_subtract, MRB_ARGS_REQ(1));