native_btree 0.1.0.alpha1 → 0.2.0

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/CMakeLists.txt +54 -0
  4. data/Gemfile +18 -0
  5. data/LICENSE +165 -0
  6. data/README.md +67 -0
  7. data/Rakefile +48 -0
  8. data/ext/native_btree/CMakeLists.txt +38 -0
  9. data/ext/native_btree/comparator.c +13 -0
  10. data/ext/native_btree/constructor.c +19 -0
  11. data/ext/native_btree/conversion.c +54 -0
  12. data/ext/native_btree/extconf_cmake.rb +15 -0
  13. data/ext/native_btree/include/common.h +21 -0
  14. data/ext/native_btree/include/comparator.h +4 -0
  15. data/ext/native_btree/include/constructor.h +11 -0
  16. data/ext/native_btree/include/conversion.h +8 -0
  17. data/ext/native_btree/include/instance.h +22 -0
  18. data/ext/native_btree/include/iterators.h +5 -0
  19. data/ext/native_btree/include/native_btree.h +5 -47
  20. data/ext/native_btree/include/rbtree_type.h +22 -0
  21. data/ext/native_btree/instance.c +126 -0
  22. data/ext/native_btree/iterators.c +26 -0
  23. data/ext/native_btree/native_btree.c +20 -22
  24. data/ext/native_btree/rbtree_type.c +102 -0
  25. data/lib/native_btree/native_btree.bundle +0 -0
  26. data/lib/native_btree/native_btree.so +0 -0
  27. data/lib/native_btree/version.rb +2 -2
  28. data/lib/native_btree.rb +2 -1
  29. data/native_btree.gemspec +33 -0
  30. data/spec/debug.rb +24 -0
  31. data/spec/native_btree_class_spec.rb +24 -0
  32. data/spec/native_btree_instance_spec.rb +283 -0
  33. data/spec/native_btree_module_spec.rb +15 -0
  34. data/spec/spec_helper.rb +15 -0
  35. metadata +50 -18
  36. data/ext/native_btree/btree.cc +0 -128
  37. data/ext/native_btree/extconf.h +0 -11
  38. data/ext/native_btree/extconf.rb +0 -35
  39. data/ext/native_btree/rb_methods.cc +0 -221
@@ -1,221 +0,0 @@
1
- #include <ruby.h>
2
- #include <glib.h>
3
-
4
- #include "native_btree.h"
5
- #include "btree.h"
6
-
7
-
8
- extern "C" {
9
-
10
- class BTreeEQCtxt {
11
- public:
12
- VALUE eq = Qtrue;
13
- BTree *tree2 = nullptr;
14
- };
15
-
16
- static void
17
- btree_free(BTree *btree)
18
- {
19
- delete btree;
20
- }
21
-
22
- static void
23
- btree_mark(gpointer obj)
24
- {
25
- reinterpret_cast<BTree *>(obj)->mark();
26
- }
27
-
28
- static VALUE
29
- btree_enum_size(VALUE tree, VALUE args, VALUE eobj)
30
- {
31
- return btree_size(tree);
32
- }
33
-
34
-
35
- VALUE
36
- btree_new(VALUE klass)
37
- {
38
- rb_need_block();
39
-
40
- VALUE comparator = rb_block_lambda();
41
-
42
- BTree *tree = new BTree(comparator);
43
-
44
- VALUE instance = Data_Wrap_Struct(klass, btree_mark, btree_free, tree);
45
-
46
- return instance;
47
- }
48
-
49
- VALUE
50
- btree_init(VALUE self)
51
- {
52
- return self;
53
- }
54
-
55
- VALUE
56
- btree_size(VALUE self)
57
- {
58
- BTree *tree;
59
- Data_Get_Struct(self, BTree, tree);
60
-
61
- VALUE result = INT2NUM(tree->size());
62
-
63
- return result;
64
- }
65
-
66
- VALUE
67
- btree_height(VALUE self)
68
- {
69
- BTree *tree;
70
- Data_Get_Struct(self, BTree, tree);
71
-
72
- VALUE result = INT2NUM(tree->height());
73
-
74
- return result;
75
- }
76
-
77
-
78
- VALUE
79
- btree_set(VALUE self, VALUE key, VALUE value)
80
- {
81
- BTree *tree;
82
- Data_Get_Struct(self, BTree, tree);
83
-
84
- tree->set(key, value);
85
-
86
- return Qnil;
87
- }
88
-
89
- VALUE
90
- btree_get(VALUE self, VALUE key)
91
- {
92
- BTree *tree;
93
- Data_Get_Struct(self, BTree, tree);
94
-
95
- return tree->get(key);
96
- }
97
-
98
- VALUE
99
- btree_delete(VALUE self, VALUE key)
100
- {
101
- BTree *tree;
102
- Data_Get_Struct(self, BTree, tree);
103
-
104
- bool result = tree->del(key);
105
-
106
- return result ? Qtrue : Qfalse;
107
- }
108
-
109
- VALUE
110
- btree_clear(VALUE self)
111
- {
112
- BTree *tree;
113
- Data_Get_Struct(self, BTree, tree);
114
-
115
- tree->clear();
116
-
117
- return Qnil;
118
- }
119
-
120
- VALUE
121
- btree_has(VALUE self, VALUE key)
122
- {
123
- BTree *tree;
124
- Data_Get_Struct(self, BTree, tree);
125
-
126
- bool result = tree->has(key);
127
-
128
- return result ? Qtrue : Qfalse;
129
- }
130
-
131
- VALUE
132
- btree_each(VALUE self)
133
- {
134
- RETURN_SIZED_ENUMERATOR(self, 0, 0, btree_enum_size);
135
-
136
- VALUE block = rb_block_lambda();
137
-
138
- BTree *tree;
139
- Data_Get_Struct(self, BTree, tree);
140
-
141
- tree->each(block);
142
-
143
- return Qnil;
144
- }
145
-
146
- // TODO: Need implementation
147
- VALUE
148
- btree_cmp(VALUE self, VALUE tree2)
149
- {
150
- return Qnil;
151
- }
152
-
153
- static gboolean
154
- eql_comparator(gpointer k, gpointer v, gpointer data)
155
- {
156
- VALUE key = reinterpret_cast<VALUE>(k);
157
- VALUE val = reinterpret_cast<VALUE>(v);
158
- BTreeEQCtxt *context = reinterpret_cast<BTreeEQCtxt *>(data);
159
-
160
- VALUE val2 = context->tree2->get(key);
161
-
162
- // key not found
163
- if (NIL_P(val2)) {
164
- context->eq = Qfalse;
165
-
166
- return TRUE;
167
- }
168
-
169
- // values !eql
170
- if (!rb_eql(val, val2)) {
171
- context->eq = Qfalse;
172
-
173
- return TRUE;
174
- }
175
-
176
- return FALSE;
177
- }
178
-
179
- static VALUE// obj arg recur
180
- recursive_eql(VALUE tree, VALUE tree2, int recur)
181
- {
182
- if (recur)
183
- return Qtrue; /* Subtle! */
184
-
185
- BTree *t, *t2;
186
- Data_Get_Struct(tree, BTree, t);
187
- Data_Get_Struct(tree2, BTree, t2);
188
-
189
- BTreeEQCtxt context;
190
- // context.eq == Qtrue;
191
-
192
- context.tree2 = t2;
193
-
194
- t->each(eql_comparator, reinterpret_cast<gpointer>(&context));
195
-
196
- return context.eq;
197
- }
198
-
199
- VALUE
200
- btree_equal(VALUE self, VALUE tree2)
201
- {
202
- BTree *t, *t2;
203
- Data_Get_Struct(self, BTree, t);
204
- Data_Get_Struct(tree2, BTree, t2);
205
-
206
- if (self == tree2)
207
- return Qtrue;
208
-
209
- if (CLASS_OF(tree2) != btree_class)
210
- return Qfalse;
211
-
212
- if (t->size() != t2->size() || t->height() != t2->height())
213
- return Qfalse;
214
-
215
- if (t->size() == 0)
216
- return Qtrue;
217
- // func obj paired arg
218
- return rb_exec_recursive_paired(recursive_eql, self, tree2, tree2);
219
- }
220
-
221
- }