rbtree 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +22 -0
- data/LICENSE +1 -1
- data/README +3 -3
- data/extconf.rb +3 -8
- data/rbtree.c +59 -23
- data/test.rb +41 -12
- metadata +2 -2
data/ChangeLog
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
2009-11-14 OZAWA Takuma
|
2
|
+
|
3
|
+
* version 0.3.0 released.
|
4
|
+
|
5
|
+
2009-11-10 OZAWA Takuma
|
6
|
+
|
7
|
+
* rbtree.c: applied patches for Ruby 1.9 by Florian Gilcher and
|
8
|
+
Nobu Nakada. Thanks.
|
9
|
+
http://redmine.ruby-lang.org/issues/show/2348
|
10
|
+
|
11
|
+
* test.rb: ditto.
|
12
|
+
|
13
|
+
* extconf.rb: ditto.
|
14
|
+
|
15
|
+
* extconf.rb: remove options for only gcc.
|
16
|
+
|
17
|
+
* test.rb (test_inspect): correct recursion tests.
|
18
|
+
|
19
|
+
* rbtree.c (rbtree_to_s_recursive): should return if recursive.
|
20
|
+
|
21
|
+
* test.rb (test_to_s): add recursion tests.
|
22
|
+
|
1
23
|
2009-01-27 OZAWA Takuma
|
2
24
|
|
3
25
|
* version 0.2.1 released.
|
data/LICENSE
CHANGED
data/README
CHANGED
@@ -55,7 +55,7 @@ duplications of keys but MultiRBTree does.
|
|
55
55
|
|
56
56
|
== Requirement
|
57
57
|
|
58
|
-
* Ruby 1.8.x
|
58
|
+
* Ruby 1.8.x, 1.9.1
|
59
59
|
|
60
60
|
== Install
|
61
61
|
|
@@ -63,7 +63,7 @@ duplications of keys but MultiRBTree does.
|
|
63
63
|
|
64
64
|
or download a tarball from the link below
|
65
65
|
|
66
|
-
* ((<"Ruby/RBTree 0.
|
66
|
+
* ((<"Ruby/RBTree 0.3.0"|URL:rbtree-0.3.0.tar.gz>))
|
67
67
|
|
68
68
|
and then
|
69
69
|
|
@@ -85,7 +85,7 @@ or online documents at ((<URL:http://rbtree.rubyforge.org/>)).
|
|
85
85
|
|
86
86
|
== License
|
87
87
|
|
88
|
-
MIT License. Copyright (c) 2002-2004, 2007, 2009 OZAWA Takuma.
|
88
|
+
MIT License. Copyright (c) 2002-2004, 2007, 2009-2010 OZAWA Takuma.
|
89
89
|
|
90
90
|
dict.c and dict.h are modified copies that are originally in Kazlib
|
91
91
|
written by Kaz Kylheku. Copyright is held by Kaz Kylheku, see dict.c
|
data/extconf.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
else
|
7
|
-
$defs << '-DNDEBUG'
|
8
|
-
end
|
9
|
-
|
10
|
-
have_func('rb_enumeratorize')
|
3
|
+
$defs << '-DNDEBUG'
|
4
|
+
have_header('ruby/st.h')
|
5
|
+
have_func('rb_exec_recursive', 'ruby.h')
|
11
6
|
create_makefile('rbtree')
|
data/rbtree.c
CHANGED
@@ -1,20 +1,30 @@
|
|
1
1
|
/*
|
2
2
|
* MIT License
|
3
|
-
* Copyright (c) 2002-2004, 2007, 2009 OZAWA Takuma
|
3
|
+
* Copyright (c) 2002-2004, 2007, 2009-2010 OZAWA Takuma
|
4
4
|
*/
|
5
5
|
#include <ruby.h>
|
6
|
-
#
|
6
|
+
#ifdef HAVE_RUBY_ST_H
|
7
|
+
#include <ruby/st.h>
|
8
|
+
#else
|
7
9
|
#include <st.h>
|
10
|
+
#endif
|
8
11
|
#include <stdarg.h>
|
9
12
|
#include "dict.h"
|
10
13
|
|
11
14
|
#define RBTREE_PROC_DEFAULT FL_USER2
|
12
15
|
#define HASH_PROC_DEFAULT FL_USER2
|
13
16
|
|
14
|
-
#ifndef
|
17
|
+
#ifndef RETURN_ENUMERATOR
|
15
18
|
#define RETURN_ENUMERATOR(obj, argc, argv) ((void)0)
|
16
19
|
#endif
|
17
20
|
|
21
|
+
#ifndef RHASH_TBL
|
22
|
+
#define RHASH_TBL(h) RHASH(h)->tbl
|
23
|
+
#endif
|
24
|
+
#ifndef RHASH_IFNONE
|
25
|
+
#define RHASH_IFNONE(h) RHASH(h)->ifnone
|
26
|
+
#endif
|
27
|
+
|
18
28
|
VALUE RBTree;
|
19
29
|
VALUE MultiRBTree;
|
20
30
|
|
@@ -184,24 +194,24 @@ rbtree_s_create(int argc, VALUE* argv, VALUE klass)
|
|
184
194
|
tmp = rb_check_convert_type(argv[0], T_HASH, "Hash", "to_hash");
|
185
195
|
if (!NIL_P(tmp)) {
|
186
196
|
rbtree = rbtree_alloc(klass);
|
187
|
-
st_foreach(
|
197
|
+
st_foreach(RHASH_TBL(tmp), hash_to_rbtree_i, rbtree);
|
188
198
|
return rbtree;
|
189
199
|
}
|
190
200
|
|
191
201
|
tmp = rb_check_array_type(argv[0]);
|
192
202
|
if (!NIL_P(tmp)) {
|
193
203
|
rbtree = rbtree_alloc(klass);
|
194
|
-
for (i = 0; i <
|
195
|
-
VALUE v = rb_check_array_type(
|
204
|
+
for (i = 0; i < RARRAY_LEN(tmp); i++) {
|
205
|
+
VALUE v = rb_check_array_type(RARRAY_PTR(tmp)[i]);
|
196
206
|
if (NIL_P(v)) {
|
197
207
|
continue;
|
198
208
|
}
|
199
|
-
switch(
|
209
|
+
switch(RARRAY_LEN(v)) {
|
200
210
|
case 1:
|
201
|
-
rbtree_aset(rbtree,
|
211
|
+
rbtree_aset(rbtree, RARRAY_PTR(v)[0], Qnil);
|
202
212
|
break;
|
203
213
|
case 2:
|
204
|
-
rbtree_aset(rbtree,
|
214
|
+
rbtree_aset(rbtree, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]);
|
205
215
|
break;
|
206
216
|
default:
|
207
217
|
continue;
|
@@ -351,7 +361,7 @@ rbtree_fetch(int argc, VALUE* argv, VALUE self)
|
|
351
361
|
rbtree_argc_error();
|
352
362
|
block_given = rb_block_given_p();
|
353
363
|
if (block_given && argc == 2)
|
354
|
-
|
364
|
+
rb_warn("block supersedes default value argument");
|
355
365
|
|
356
366
|
node = dict_lookup(DICT(self), TO_KEY(argv[0]));
|
357
367
|
if (node != NULL)
|
@@ -427,7 +437,7 @@ rbtree_default_proc(VALUE self)
|
|
427
437
|
static int
|
428
438
|
value_eq(const void* key1, const void* key2)
|
429
439
|
{
|
430
|
-
return rb_equal((VALUE)key1, (VALUE)key2);
|
440
|
+
return rb_equal((VALUE)key1, (VALUE)key2) != 0;
|
431
441
|
}
|
432
442
|
|
433
443
|
/*
|
@@ -1059,7 +1069,7 @@ rbtree_to_a(VALUE self)
|
|
1059
1069
|
static each_return_t
|
1060
1070
|
to_hash_i(dnode_t* node, void* hash)
|
1061
1071
|
{
|
1062
|
-
st_insert(
|
1072
|
+
st_insert(RHASH_TBL((VALUE)hash), GET_KEY(node), GET_VAL(node));
|
1063
1073
|
return EACH_NEXT;
|
1064
1074
|
}
|
1065
1075
|
|
@@ -1076,7 +1086,7 @@ rbtree_to_hash(VALUE self)
|
|
1076
1086
|
|
1077
1087
|
hash = rb_hash_new();
|
1078
1088
|
rbtree_for_each(self, to_hash_i, (void*)hash);
|
1079
|
-
|
1089
|
+
RHASH_IFNONE(hash) = IFNONE(self);
|
1080
1090
|
if (FL_TEST(self, RBTREE_PROC_DEFAULT))
|
1081
1091
|
FL_SET(hash, HASH_PROC_DEFAULT);
|
1082
1092
|
OBJ_INFECT(hash, self);
|
@@ -1096,9 +1106,8 @@ static VALUE
|
|
1096
1106
|
rbtree_begin_inspect(VALUE self)
|
1097
1107
|
{
|
1098
1108
|
const char* c = rb_class2name(CLASS_OF(self));
|
1099
|
-
VALUE str = rb_str_new(0, strlen(c) +
|
1100
|
-
|
1101
|
-
RSTRING(str)->len = len;
|
1109
|
+
VALUE str = rb_str_new(0, strlen(c) + 4);
|
1110
|
+
sprintf(RSTRING_PTR(str), "#<%s: ", c);
|
1102
1111
|
return str;
|
1103
1112
|
}
|
1104
1113
|
|
@@ -1108,15 +1117,29 @@ to_s_rbtree(VALUE self, VALUE nil)
|
|
1108
1117
|
return rb_ary_to_s(rbtree_to_a(self));
|
1109
1118
|
}
|
1110
1119
|
|
1120
|
+
#ifdef HAVE_RB_EXEC_RECURSIVE
|
1121
|
+
static VALUE
|
1122
|
+
rbtree_to_s_recursive(VALUE self, VALUE arg, int recursive)
|
1123
|
+
{
|
1124
|
+
if (recursive)
|
1125
|
+
return rb_str_cat2(rbtree_begin_inspect(self), "...>");
|
1126
|
+
return to_s_rbtree(self, Qnil);
|
1127
|
+
}
|
1128
|
+
#endif
|
1129
|
+
|
1111
1130
|
/*
|
1112
1131
|
*
|
1113
1132
|
*/
|
1114
1133
|
VALUE
|
1115
1134
|
rbtree_to_s(VALUE self)
|
1116
1135
|
{
|
1136
|
+
#ifdef HAVE_RB_EXEC_RECURSIVE
|
1137
|
+
return rb_exec_recursive(rbtree_to_s_recursive, self, Qnil);
|
1138
|
+
#else
|
1117
1139
|
if (rb_inspecting_p(self))
|
1118
1140
|
return rb_str_cat2(rbtree_begin_inspect(self), "...>");
|
1119
1141
|
return rb_protect_inspect(to_s_rbtree, self, Qnil);
|
1142
|
+
#endif
|
1120
1143
|
}
|
1121
1144
|
|
1122
1145
|
static each_return_t
|
@@ -1125,8 +1148,8 @@ inspect_i(dnode_t* node, void* ret_)
|
|
1125
1148
|
VALUE ret = (VALUE)ret_;
|
1126
1149
|
VALUE str;
|
1127
1150
|
|
1128
|
-
if (
|
1129
|
-
|
1151
|
+
if (RSTRING_PTR(ret)[0] == '-')
|
1152
|
+
RSTRING_PTR(ret)[0] = '#';
|
1130
1153
|
else
|
1131
1154
|
rb_str_cat2(ret, ", ");
|
1132
1155
|
|
@@ -1149,9 +1172,9 @@ inspect_rbtree(VALUE self, VALUE ret)
|
|
1149
1172
|
VALUE str;
|
1150
1173
|
|
1151
1174
|
rb_str_cat2(ret, "{");
|
1152
|
-
|
1175
|
+
RSTRING_PTR(ret)[0] = '-';
|
1153
1176
|
rbtree_for_each(self, inspect_i, (void*)ret);
|
1154
|
-
|
1177
|
+
RSTRING_PTR(ret)[0] = '#';
|
1155
1178
|
rb_str_cat2(ret, "}");
|
1156
1179
|
|
1157
1180
|
str = rb_inspect(IFNONE(self));
|
@@ -1169,16 +1192,29 @@ inspect_rbtree(VALUE self, VALUE ret)
|
|
1169
1192
|
return ret;
|
1170
1193
|
}
|
1171
1194
|
|
1195
|
+
static VALUE
|
1196
|
+
rbtree_inspect_recursive(VALUE self, VALUE arg, int recursive)
|
1197
|
+
{
|
1198
|
+
VALUE str = rbtree_begin_inspect(self);
|
1199
|
+
if (recursive)
|
1200
|
+
return rb_str_cat2(str, "...>");
|
1201
|
+
return inspect_rbtree(self, str);
|
1202
|
+
}
|
1203
|
+
|
1172
1204
|
/*
|
1173
1205
|
*
|
1174
1206
|
*/
|
1175
1207
|
VALUE
|
1176
1208
|
rbtree_inspect(VALUE self)
|
1177
1209
|
{
|
1210
|
+
#ifdef HAVE_RB_EXEC_RECURSIVE
|
1211
|
+
return rb_exec_recursive(rbtree_inspect_recursive, self, Qnil);
|
1212
|
+
#else
|
1178
1213
|
VALUE str = rbtree_begin_inspect(self);
|
1179
1214
|
if (rb_inspecting_p(self))
|
1180
1215
|
return rb_str_cat2(str, "...>");
|
1181
1216
|
return rb_protect_inspect(inspect_rbtree, self, str);
|
1217
|
+
#endif
|
1182
1218
|
}
|
1183
1219
|
|
1184
1220
|
/*
|
@@ -1463,7 +1499,7 @@ rbtree_pretty_print(VALUE self, VALUE pp)
|
|
1463
1499
|
VALUE
|
1464
1500
|
rbtree_pretty_print_cycle(VALUE self, VALUE pp)
|
1465
1501
|
{
|
1466
|
-
return rb_funcall(pp, id_pp, 1,
|
1502
|
+
return rb_funcall(pp, id_pp, 1, rbtree_inspect_recursive(self, Qnil, 1));
|
1467
1503
|
}
|
1468
1504
|
|
1469
1505
|
/*********************************************************************/
|
@@ -1510,8 +1546,8 @@ rbtree_s_load(VALUE klass, VALUE str)
|
|
1510
1546
|
{
|
1511
1547
|
VALUE rbtree = rbtree_alloc(klass);
|
1512
1548
|
VALUE ary = rb_marshal_load(str);
|
1513
|
-
VALUE* ptr =
|
1514
|
-
long len =
|
1549
|
+
VALUE* ptr = RARRAY_PTR(ary);
|
1550
|
+
long len = RARRAY_LEN(ary) - 1;
|
1515
1551
|
long i;
|
1516
1552
|
|
1517
1553
|
for (i = 0; i < len; i += 2)
|
data/test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "rbtree"
|
1
|
+
require "./rbtree"
|
2
2
|
require "test/unit.rb"
|
3
3
|
|
4
4
|
class RBTreeTest < Test::Unit::TestCase
|
@@ -135,7 +135,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
135
135
|
assert_equal("e", rbtree.default("f"))
|
136
136
|
assert_raises(ArgumentError) { rbtree.default("e", "f") }
|
137
137
|
|
138
|
-
rbtree = RBTree.new {|
|
138
|
+
rbtree = RBTree.new {|tree, key| @rbtree[key || "c"] }
|
139
139
|
assert_equal("C", rbtree.default(nil))
|
140
140
|
assert_equal("B", rbtree.default("b"))
|
141
141
|
end
|
@@ -181,7 +181,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
181
181
|
|
182
182
|
a = RBTree.new
|
183
183
|
b = RBTree.new
|
184
|
-
a.readjust {|
|
184
|
+
a.readjust {|x, y| x <=> y }
|
185
185
|
assert_not_equal(a, b)
|
186
186
|
b.readjust(a.cmp_proc)
|
187
187
|
assert_equal(a, b)
|
@@ -197,7 +197,17 @@ class RBTreeTest < Test::Unit::TestCase
|
|
197
197
|
|
198
198
|
assert_equal("E", @rbtree.fetch("e", "E"))
|
199
199
|
assert_equal("E", @rbtree.fetch("e") { "E" })
|
200
|
-
|
200
|
+
|
201
|
+
class << (stderr = "")
|
202
|
+
alias write <<
|
203
|
+
end
|
204
|
+
$stderr, stderr, $VERBOSE, verbose = stderr, $stderr, false, $VERBOSE
|
205
|
+
begin
|
206
|
+
assert_equal("E", @rbtree.fetch("e", "F") { "E" })
|
207
|
+
ensure
|
208
|
+
$stderr, stderr, $VERBOSE, verbose = stderr, $stderr, false, $VERBOSE
|
209
|
+
end
|
210
|
+
assert_match(/warning: block supersedes default value argument/, stderr)
|
201
211
|
|
202
212
|
assert_raises(ArgumentError) { @rbtree.fetch }
|
203
213
|
assert_raises(ArgumentError) { @rbtree.fetch("e", "E", "E") }
|
@@ -497,7 +507,18 @@ class RBTreeTest < Test::Unit::TestCase
|
|
497
507
|
end
|
498
508
|
|
499
509
|
def test_to_s
|
500
|
-
|
510
|
+
if RUBY_VERSION < "1.9"
|
511
|
+
assert_equal("aAbBcCdD", @rbtree.to_s)
|
512
|
+
else
|
513
|
+
expected = "[[\"a\", \"A\"], [\"b\", \"B\"], [\"c\", \"C\"], [\"d\", \"D\"]]"
|
514
|
+
assert_equal(expected, @rbtree.to_s)
|
515
|
+
|
516
|
+
rbtree = RBTree.new
|
517
|
+
rbtree[rbtree] = rbtree
|
518
|
+
rbtree.default = rbtree
|
519
|
+
expected = "[[#<RBTree: {#<RBTree: ...>=>#<RBTree: ...>}, default=#<RBTree: ...>, cmp_proc=nil>, #<RBTree: {#<RBTree: ...>=>#<RBTree: ...>}, default=#<RBTree: ...>, cmp_proc=nil>]]"
|
520
|
+
assert_equal(expected, rbtree.to_s)
|
521
|
+
end
|
501
522
|
end
|
502
523
|
|
503
524
|
def test_to_hash
|
@@ -529,7 +550,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
529
550
|
tree, default, cmp_proc = match.to_a[1..-1]
|
530
551
|
assert_equal(%({"a"=>"A", "b"=>"B", "c"=>"C", "d"=>"D"}), tree)
|
531
552
|
assert_equal(%("e"), default)
|
532
|
-
assert_match(/#<Proc:\w+(
|
553
|
+
assert_match(/#<Proc:\w+(@#{__FILE__}:\d+)?>/o, cmp_proc)
|
533
554
|
|
534
555
|
rbtree = RBTree.new
|
535
556
|
assert_match(re, rbtree.inspect)
|
@@ -540,10 +561,13 @@ class RBTreeTest < Test::Unit::TestCase
|
|
540
561
|
assert_equal("nil", cmp_proc)
|
541
562
|
|
542
563
|
rbtree = RBTree.new
|
543
|
-
rbtree[
|
544
|
-
|
564
|
+
rbtree[rbtree] = rbtree
|
565
|
+
rbtree.default = rbtree
|
545
566
|
match = re.match(rbtree.inspect)
|
546
|
-
|
567
|
+
tree, default, cmp_proc = match.to_a[1..-1]
|
568
|
+
assert_equal("{#<RBTree: ...>=>#<RBTree: ...>}", tree)
|
569
|
+
assert_equal("#<RBTree: ...>", default)
|
570
|
+
assert_equal("nil", cmp_proc)
|
547
571
|
end
|
548
572
|
|
549
573
|
def test_lower_bound
|
@@ -702,7 +726,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
702
726
|
|
703
727
|
def test_pp
|
704
728
|
assert_equal(%(#<RBTree: {}, default=nil, cmp_proc=nil>\n),
|
705
|
-
PP.pp(RBTree
|
729
|
+
PP.pp(RBTree.new, ""))
|
706
730
|
assert_equal(%(#<RBTree: {"a"=>"A", "b"=>"B"}, default=nil, cmp_proc=nil>\n),
|
707
731
|
PP.pp(RBTree[*%w(a A b B)], ""))
|
708
732
|
|
@@ -728,7 +752,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
728
752
|
EOS
|
729
753
|
assert_equal(expected, PP.pp(rbtree, ""))
|
730
754
|
|
731
|
-
rbtree = RBTree
|
755
|
+
rbtree = RBTree.new
|
732
756
|
rbtree[rbtree] = rbtree
|
733
757
|
rbtree.default = rbtree
|
734
758
|
expected = <<EOS
|
@@ -778,7 +802,12 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
778
802
|
end
|
779
803
|
|
780
804
|
def test_to_s
|
781
|
-
|
805
|
+
if RUBY_VERSION < "1.9"
|
806
|
+
assert_equal("aAbBbCbDcC", @rbtree.to_s)
|
807
|
+
else
|
808
|
+
expected = "[[\"a\", \"A\"], [\"b\", \"B\"], [\"b\", \"C\"], \[\"b\", \"D\"], [\"c\", \"C\"]]"
|
809
|
+
assert_equal(expected, @rbtree.to_s)
|
810
|
+
end
|
782
811
|
end
|
783
812
|
|
784
813
|
def test_to_hash
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbtree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OZAWA Takuma
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-14 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|