*/
#include <ruby.h>
+#include <st.h>
#include <stdbool.h>
#include <ctype.h>
#include <assert.h>
return Qfalse;
}
+static int
+merge_cb (VALUE key, VALUE value, VALUE self)
+{
+ c_aset (self, key, value);
+
+ return ST_CONTINUE;
+}
+
+/*
+ * call-seq:
+ * object.merge!(hash) -> object
+ *
+ * Adds the key-value pairs from *hash* to *object*, overwriting existing
+ * values if a key already existed in *object*.
+ */
+static VALUE
+c_merge (VALUE self, VALUE hash)
+{
+ Check_Type (hash, T_HASH);
+
+ rb_hash_foreach (hash, merge_cb, self);
+
+ return self;
+}
+
/*
* call-seq:
* object <=> other -> -1, 0 or 1
rb_define_method (c, "empty?", c_get_empty, 0);
rb_define_method (c, "keys", c_keys, 0);
rb_define_method (c, "values", c_values, 0);
+ rb_define_method (c, "merge!", c_merge, 1);
rb_include_module (c, rb_mComparable);
rb_define_method (c, "<=>", c_compare, 1);
end
end
end
+
+ def test_merge
+ repl = {
+ "artist" => "Ballista",
+ "genre" => "Death Metal",
+ }
+
+ Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+ t.comments.merge!(repl)
+
+ assert_equal(["artist", "album", "date", "genre"],
+ t.comments.keys)
+ assert_equal(["Ballista", "...For Victory", "1994",
+ "Death Metal"],
+ t.comments.values)
+ end
+ end
end