archipelago_rbtree 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +421 -0
- data/LICENSE +22 -0
- data/Makefile +153 -0
- data/README +82 -0
- data/Rakefile +47 -0
- data/archipelago_rbtree.bundle +0 -0
- data/archipelago_rbtree.o +0 -0
- data/depend +2 -0
- data/dict.o +0 -0
- data/ext/archipelago_rbtree.c +1715 -0
- data/ext/dict.c +1216 -0
- data/ext/dict.h +123 -0
- data/ext/extconf.rb +38 -0
- data/mkmf.log +175 -0
- data/tests/rbtree_test.rb +887 -0
- metadata +63 -0
data/ext/dict.h
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
/*
|
2
|
+
* Dictionary Abstract Data Type
|
3
|
+
* Copyright (C) 1997 Kaz Kylheku <kaz@ashi.footprints.net>
|
4
|
+
*
|
5
|
+
* Free Software License:
|
6
|
+
*
|
7
|
+
* All rights are reserved by the author, with the following exceptions:
|
8
|
+
* Permission is granted to freely reproduce and distribute this software,
|
9
|
+
* possibly in exchange for a fee, provided that this copyright notice appears
|
10
|
+
* intact. Permission is also granted to adapt this software to produce
|
11
|
+
* derivative works, as long as the modified versions carry this copyright
|
12
|
+
* notice and additional notices stating that the work has been modified.
|
13
|
+
* This source code may be translated into executable form and incorporated
|
14
|
+
* into proprietary software; there is no requirement for such software to
|
15
|
+
* contain a copyright notice related to this source.
|
16
|
+
*
|
17
|
+
* $Id: dict.h,v 1.9 2005/10/06 05:16:35 kuma Exp $
|
18
|
+
* $Name: $
|
19
|
+
*/
|
20
|
+
|
21
|
+
/*
|
22
|
+
* Modified for Ruby/RBTree by OZAWA Takuma.
|
23
|
+
*/
|
24
|
+
|
25
|
+
#ifndef DICT_H
|
26
|
+
#define DICT_H
|
27
|
+
|
28
|
+
#include <limits.h>
|
29
|
+
|
30
|
+
/*
|
31
|
+
* Blurb for inclusion into C++ translation units
|
32
|
+
*/
|
33
|
+
|
34
|
+
#ifdef __cplusplus
|
35
|
+
extern "C" {
|
36
|
+
#endif
|
37
|
+
|
38
|
+
typedef unsigned long dictcount_t;
|
39
|
+
#define DICTCOUNT_T_MAX ULONG_MAX
|
40
|
+
|
41
|
+
/*
|
42
|
+
* The dictionary is implemented as a red-black tree
|
43
|
+
*/
|
44
|
+
|
45
|
+
typedef enum { dnode_red, dnode_black } dnode_color_t;
|
46
|
+
|
47
|
+
typedef struct dnode_t {
|
48
|
+
struct dnode_t *dict_left;
|
49
|
+
struct dnode_t *dict_right;
|
50
|
+
struct dnode_t *dict_parent;
|
51
|
+
dnode_color_t dict_color;
|
52
|
+
const void *dict_key;
|
53
|
+
void *dict_data;
|
54
|
+
} dnode_t;
|
55
|
+
|
56
|
+
typedef int (*dict_comp_t)(const void *, const void *, void *);
|
57
|
+
typedef dnode_t *(*dnode_alloc_t)(void *);
|
58
|
+
typedef void (*dnode_free_t)(dnode_t *, void *);
|
59
|
+
|
60
|
+
typedef int (*dict_value_eql_t)(const void *, const void *);
|
61
|
+
|
62
|
+
typedef struct dict_t {
|
63
|
+
dnode_t dict_nilnode;
|
64
|
+
dictcount_t dict_nodecount;
|
65
|
+
dict_comp_t dict_compare;
|
66
|
+
dnode_alloc_t dict_allocnode;
|
67
|
+
dnode_free_t dict_freenode;
|
68
|
+
void *dict_context;
|
69
|
+
int dict_dupes;
|
70
|
+
} dict_t;
|
71
|
+
|
72
|
+
typedef void (*dnode_process_t)(dict_t *, dnode_t *, void *);
|
73
|
+
|
74
|
+
typedef struct dict_load_t {
|
75
|
+
dict_t *dict_dictptr;
|
76
|
+
dnode_t dict_nilnode;
|
77
|
+
} dict_load_t;
|
78
|
+
|
79
|
+
extern dict_t *dict_create(dict_comp_t);
|
80
|
+
extern void dict_set_allocator(dict_t *, dnode_alloc_t, dnode_free_t, void *);
|
81
|
+
extern void dict_destroy(dict_t *);
|
82
|
+
extern void dict_free_nodes(dict_t *);
|
83
|
+
extern void dict_free(dict_t *);
|
84
|
+
extern dict_t *dict_init(dict_t *, dict_comp_t);
|
85
|
+
extern void dict_init_like(dict_t *, const dict_t *);
|
86
|
+
extern int dict_verify(dict_t *);
|
87
|
+
extern int dict_similar(const dict_t *, const dict_t *);
|
88
|
+
extern dnode_t *dict_lookup(dict_t *, const void *);
|
89
|
+
extern dnode_t *dict_lower_bound(dict_t *, const void *);
|
90
|
+
extern dnode_t *dict_upper_bound(dict_t *, const void *);
|
91
|
+
extern int dict_insert(dict_t *, dnode_t *, const void *);
|
92
|
+
extern dnode_t *dict_delete(dict_t *, dnode_t *);
|
93
|
+
extern int dict_alloc_insert(dict_t *, const void *, void *);
|
94
|
+
extern void dict_delete_free(dict_t *, dnode_t *);
|
95
|
+
extern dnode_t *dict_first(dict_t *);
|
96
|
+
extern dnode_t *dict_last(dict_t *);
|
97
|
+
extern dnode_t *dict_next(dict_t *, dnode_t *);
|
98
|
+
extern dnode_t *dict_prev(dict_t *, dnode_t *);
|
99
|
+
extern dictcount_t dict_count(dict_t *);
|
100
|
+
extern int dict_isempty(dict_t *);
|
101
|
+
extern int dict_isfull(dict_t *);
|
102
|
+
extern int dict_contains(dict_t *, dnode_t *);
|
103
|
+
extern void dict_allow_dupes(dict_t *);
|
104
|
+
extern int dnode_is_in_a_dict(dnode_t *);
|
105
|
+
extern dnode_t *dnode_create(void *);
|
106
|
+
extern dnode_t *dnode_init(dnode_t *, void *);
|
107
|
+
extern void dnode_destroy(dnode_t *);
|
108
|
+
extern void *dnode_get(dnode_t *);
|
109
|
+
extern const void *dnode_getkey(dnode_t *);
|
110
|
+
extern void dnode_put(dnode_t *, void *);
|
111
|
+
extern void dict_process(dict_t *, void *, dnode_process_t);
|
112
|
+
extern void dict_load_begin(dict_load_t *, dict_t *);
|
113
|
+
extern void dict_load_next(dict_load_t *, dnode_t *, const void *);
|
114
|
+
extern void dict_load_end(dict_load_t *);
|
115
|
+
extern void dict_merge(dict_t *, dict_t *);
|
116
|
+
|
117
|
+
int dict_equal(dict_t*, dict_t*, dict_value_eql_t);
|
118
|
+
|
119
|
+
#ifdef __cplusplus
|
120
|
+
}
|
121
|
+
#endif
|
122
|
+
|
123
|
+
#endif
|
data/ext/extconf.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
def print(*args)
|
4
|
+
STDOUT.print *args
|
5
|
+
STDOUT.flush
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
$CFLAGS << ' -std=c89 -pedantic -Wall -Wno-long-long'
|
10
|
+
$defs << ' -DNDEBUG'
|
11
|
+
|
12
|
+
|
13
|
+
print 'checking for allocation framework... '
|
14
|
+
if Object.respond_to?(:allocate)
|
15
|
+
print "yes\n"
|
16
|
+
$defs << '-DHAVE_OBJECT_ALLOCATE'
|
17
|
+
else
|
18
|
+
print "no\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
have_func('rb_obj_init_copy')
|
22
|
+
have_func('rb_block_proc')
|
23
|
+
have_func('rb_yield_values')
|
24
|
+
have_func('rb_marshal_dump')
|
25
|
+
have_func('rb_marshal_load')
|
26
|
+
|
27
|
+
print 'checking for inline keyword... '
|
28
|
+
inline = ['inline', '__inline', '__inline__', ''].find {|e|
|
29
|
+
try_link(<<EOS)
|
30
|
+
int main() { return 0; }
|
31
|
+
#{e} void foo() {}
|
32
|
+
EOS
|
33
|
+
}
|
34
|
+
print "#{inline}\n"
|
35
|
+
$defs << "-Dinline=#{inline}"
|
36
|
+
|
37
|
+
|
38
|
+
create_makefile('archipelago_rbtree')
|
data/mkmf.log
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
have_func: checking for rb_obj_init_copy()... -------------------- yes
|
2
|
+
|
3
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
4
|
+
conftest.c: In function ‘t’:
|
5
|
+
conftest.c:3: error: ‘rb_obj_init_copy’ undeclared (first use in this function)
|
6
|
+
conftest.c:3: error: (Each undeclared identifier is reported only once
|
7
|
+
conftest.c:3: error: for each function it appears in.)
|
8
|
+
checked program was:
|
9
|
+
/* begin */
|
10
|
+
1: /*top*/
|
11
|
+
2: int main() { return 0; }
|
12
|
+
3: int t() { void ((*volatile p)()); p = (void ((*)()))rb_obj_init_copy; return 0; }
|
13
|
+
/* end */
|
14
|
+
|
15
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
16
|
+
conftest.c: In function ‘t’:
|
17
|
+
conftest.c:3: warning: implicit declaration of function ‘rb_obj_init_copy’
|
18
|
+
/usr/bin/ld: warning multiple definitions of symbol _setregid
|
19
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setregid in section (__TEXT,__text)
|
20
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setregid.So) definition of _setregid
|
21
|
+
/usr/bin/ld: warning multiple definitions of symbol _setreuid
|
22
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setreuid in section (__TEXT,__text)
|
23
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setreuid.So) definition of _setreuid
|
24
|
+
checked program was:
|
25
|
+
/* begin */
|
26
|
+
1: /*top*/
|
27
|
+
2: int main() { return 0; }
|
28
|
+
3: int t() { rb_obj_init_copy(); return 0; }
|
29
|
+
/* end */
|
30
|
+
|
31
|
+
--------------------
|
32
|
+
|
33
|
+
have_func: checking for rb_block_proc()... -------------------- yes
|
34
|
+
|
35
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
36
|
+
conftest.c: In function ‘t’:
|
37
|
+
conftest.c:3: error: ‘rb_block_proc’ undeclared (first use in this function)
|
38
|
+
conftest.c:3: error: (Each undeclared identifier is reported only once
|
39
|
+
conftest.c:3: error: for each function it appears in.)
|
40
|
+
checked program was:
|
41
|
+
/* begin */
|
42
|
+
1: /*top*/
|
43
|
+
2: int main() { return 0; }
|
44
|
+
3: int t() { void ((*volatile p)()); p = (void ((*)()))rb_block_proc; return 0; }
|
45
|
+
/* end */
|
46
|
+
|
47
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
48
|
+
conftest.c: In function ‘t’:
|
49
|
+
conftest.c:3: warning: implicit declaration of function ‘rb_block_proc’
|
50
|
+
/usr/bin/ld: warning multiple definitions of symbol _setregid
|
51
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setregid in section (__TEXT,__text)
|
52
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setregid.So) definition of _setregid
|
53
|
+
/usr/bin/ld: warning multiple definitions of symbol _setreuid
|
54
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setreuid in section (__TEXT,__text)
|
55
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setreuid.So) definition of _setreuid
|
56
|
+
checked program was:
|
57
|
+
/* begin */
|
58
|
+
1: /*top*/
|
59
|
+
2: int main() { return 0; }
|
60
|
+
3: int t() { rb_block_proc(); return 0; }
|
61
|
+
/* end */
|
62
|
+
|
63
|
+
--------------------
|
64
|
+
|
65
|
+
have_func: checking for rb_yield_values()... -------------------- yes
|
66
|
+
|
67
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
68
|
+
conftest.c: In function ‘t’:
|
69
|
+
conftest.c:3: error: ‘rb_yield_values’ undeclared (first use in this function)
|
70
|
+
conftest.c:3: error: (Each undeclared identifier is reported only once
|
71
|
+
conftest.c:3: error: for each function it appears in.)
|
72
|
+
checked program was:
|
73
|
+
/* begin */
|
74
|
+
1: /*top*/
|
75
|
+
2: int main() { return 0; }
|
76
|
+
3: int t() { void ((*volatile p)()); p = (void ((*)()))rb_yield_values; return 0; }
|
77
|
+
/* end */
|
78
|
+
|
79
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
80
|
+
conftest.c: In function ‘t’:
|
81
|
+
conftest.c:3: warning: implicit declaration of function ‘rb_yield_values’
|
82
|
+
/usr/bin/ld: warning multiple definitions of symbol _setregid
|
83
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setregid in section (__TEXT,__text)
|
84
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setregid.So) definition of _setregid
|
85
|
+
/usr/bin/ld: warning multiple definitions of symbol _setreuid
|
86
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setreuid in section (__TEXT,__text)
|
87
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setreuid.So) definition of _setreuid
|
88
|
+
checked program was:
|
89
|
+
/* begin */
|
90
|
+
1: /*top*/
|
91
|
+
2: int main() { return 0; }
|
92
|
+
3: int t() { rb_yield_values(); return 0; }
|
93
|
+
/* end */
|
94
|
+
|
95
|
+
--------------------
|
96
|
+
|
97
|
+
have_func: checking for rb_marshal_dump()... -------------------- yes
|
98
|
+
|
99
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
100
|
+
conftest.c: In function ‘t’:
|
101
|
+
conftest.c:3: error: ‘rb_marshal_dump’ undeclared (first use in this function)
|
102
|
+
conftest.c:3: error: (Each undeclared identifier is reported only once
|
103
|
+
conftest.c:3: error: for each function it appears in.)
|
104
|
+
checked program was:
|
105
|
+
/* begin */
|
106
|
+
1: /*top*/
|
107
|
+
2: int main() { return 0; }
|
108
|
+
3: int t() { void ((*volatile p)()); p = (void ((*)()))rb_marshal_dump; return 0; }
|
109
|
+
/* end */
|
110
|
+
|
111
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
112
|
+
conftest.c: In function ‘t’:
|
113
|
+
conftest.c:3: warning: implicit declaration of function ‘rb_marshal_dump’
|
114
|
+
/usr/bin/ld: warning multiple definitions of symbol _setregid
|
115
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setregid in section (__TEXT,__text)
|
116
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setregid.So) definition of _setregid
|
117
|
+
/usr/bin/ld: warning multiple definitions of symbol _setreuid
|
118
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setreuid in section (__TEXT,__text)
|
119
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setreuid.So) definition of _setreuid
|
120
|
+
checked program was:
|
121
|
+
/* begin */
|
122
|
+
1: /*top*/
|
123
|
+
2: int main() { return 0; }
|
124
|
+
3: int t() { rb_marshal_dump(); return 0; }
|
125
|
+
/* end */
|
126
|
+
|
127
|
+
--------------------
|
128
|
+
|
129
|
+
have_func: checking for rb_marshal_load()... -------------------- yes
|
130
|
+
|
131
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
132
|
+
conftest.c: In function ‘t’:
|
133
|
+
conftest.c:3: error: ‘rb_marshal_load’ undeclared (first use in this function)
|
134
|
+
conftest.c:3: error: (Each undeclared identifier is reported only once
|
135
|
+
conftest.c:3: error: for each function it appears in.)
|
136
|
+
checked program was:
|
137
|
+
/* begin */
|
138
|
+
1: /*top*/
|
139
|
+
2: int main() { return 0; }
|
140
|
+
3: int t() { void ((*volatile p)()); p = (void ((*)()))rb_marshal_load; return 0; }
|
141
|
+
/* end */
|
142
|
+
|
143
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
144
|
+
conftest.c: In function ‘t’:
|
145
|
+
conftest.c:3: warning: implicit declaration of function ‘rb_marshal_load’
|
146
|
+
/usr/bin/ld: warning multiple definitions of symbol _setregid
|
147
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setregid in section (__TEXT,__text)
|
148
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setregid.So) definition of _setregid
|
149
|
+
/usr/bin/ld: warning multiple definitions of symbol _setreuid
|
150
|
+
/opt/local/lib/libruby-static.a(process.o) definition of _setreuid in section (__TEXT,__text)
|
151
|
+
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setreuid.So) definition of _setreuid
|
152
|
+
checked program was:
|
153
|
+
/* begin */
|
154
|
+
1: /*top*/
|
155
|
+
2: int main() { return 0; }
|
156
|
+
3: int t() { rb_marshal_load(); return 0; }
|
157
|
+
/* end */
|
158
|
+
|
159
|
+
--------------------
|
160
|
+
|
161
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
162
|
+
conftest.c:2: error: syntax error before ‘void’
|
163
|
+
checked program was:
|
164
|
+
/* begin */
|
165
|
+
1: int main() { return 0; }
|
166
|
+
2: inline void foo() {}
|
167
|
+
/* end */
|
168
|
+
|
169
|
+
"gcc -o conftest -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.9.1 -Iext -I/opt/local/include -O2 -fno-common -pipe -fno-common -std=c89 -pedantic -Wall -Wno-long-long conftest.c -L"/opt/local/lib" -L/opt/local/lib -lruby-static -lpthread -ldl -lobjc "
|
170
|
+
checked program was:
|
171
|
+
/* begin */
|
172
|
+
1: int main() { return 0; }
|
173
|
+
2: __inline void foo() {}
|
174
|
+
/* end */
|
175
|
+
|