penguin_queue 0.1.0 → 0.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f65e549283761f28cc27557bf240cec2af939de8
4
- data.tar.gz: addaa9864d8e81e27b6e343c0a3369eca80c2676
3
+ metadata.gz: a4fd3cc82db722d18ca04d5041814b763bb57b2c
4
+ data.tar.gz: ef46be32133f2656159e46f7adf8ddf7960386ee
5
5
  SHA512:
6
- metadata.gz: e9849295843bd1822f9fed629cb9ecef7bfbed28fae71397c8aad19f27088e08e9f02c80e1dec43d20ddeca9b1621e7ced1dc87e8188af6632dcef94d3babd3d
7
- data.tar.gz: cedd93953d40ef6bab937840e2eeec5521b0fd0ed0cee2412a6748512441a4cb2460fb72c13706cf15cca588365af08a676f607a4e39bf6786d626b1a50bf1ee
6
+ metadata.gz: f23b0a538c39f318e66a28e37d5182d619182070ad71db09599f6d0dc286b1426c6d10a631708e93803dd5ee517ba65c3d163d4734496e5c86c85754965df064
7
+ data.tar.gz: 7e75329a8025a5d5090b40d053b23d884831d35d68b29f297a88e2fd6fa2d08c67474670a3aabe6dbefdd79c03124adf2eb7cefb90106775621e7527c57cb8d0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- penguin_queue (0.1.0)
4
+ penguin_queue (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -5,9 +5,13 @@
5
5
  ```
6
6
 
7
7
  # Install
8
+ ```
9
+ gem install penguin_queue
10
+ ```
11
+
8
12
  ```ruby
9
13
  # Gemfile
10
- gem 'penguin_queue', git: 'https://github.com/tompng/penguin_queue'
14
+ gem 'penguin_queue'
11
15
  ```
12
16
 
13
17
  # Usage
@@ -32,25 +36,25 @@ pq.size.times.map { pq.deq } #=> [8, 6, 4, 2, 0]
32
36
 
33
37
  # Methods
34
38
  ```ruby
35
- # PenguinQueue
36
- PenguinQueue.new PenguinQueue.new(&calc_priority_from_element_proc)
37
- # enqueue multiple
38
- push(e1, e2, ...) unshift(e1, e2, ...)
39
+ # initialize
40
+ PenguinQueue.new
41
+ PenguinQueue.new(order: :max) # min(default) or max
42
+ PenguinQueue.new(&calc_priority_from_element_proc)
39
43
  # enqueue
40
- <<(e) enq(e)
44
+ <<(e) enq(e) push(e) unshift(e)
41
45
  # enqueue with custom priority
42
- enq(e, priority: p)
46
+ enq(e, priority: p) push(e, priority: p) unshift(e, priority: e)
43
47
  # dequeue
44
- deq shift pop deque_with_priority
48
+ deq shift pop poll deq_with_priority
45
49
  # dequeue multiple
46
- deq(n) shift(n) pop(n)
50
+ deq(n) shift(n) pop(n) poll(n)
47
51
  # fetch
48
- first first_with_priority first_node
52
+ first peek top first_with_priority first_node
49
53
  # remove
50
54
  remove(node) delete(node)
51
55
  # other
52
- to_s inspect size empty?
56
+ to_s inspect clear size empty? min? max?
53
57
 
54
58
  # PenguinQueue::Node
55
- remove delete value value= priority priority=
59
+ remove delete value value= priority priority= to_s inspect
56
60
  ```
@@ -1,25 +1,25 @@
1
1
  #include <ruby.h>
2
2
 
3
- static ID id_priority, id_cmp, id_call;
3
+ static ID id_priority, id_cmp, id_call, id_order, id_max, id_min;
4
4
  #define RB_STR_BUF_CAT(rstr, cstr) rb_str_buf_cat((rstr), (cstr), sizeof(cstr)-1);
5
5
  struct node {
6
6
  long index, id;
7
- VALUE heap, priority, value;
7
+ VALUE queue, priority, value;
8
8
  };
9
9
  VALUE node_class;
10
10
  void node_mark(struct node *ptr){
11
- rb_gc_mark(ptr->heap);
11
+ rb_gc_mark(ptr->queue);
12
12
  rb_gc_mark(ptr->priority);
13
13
  rb_gc_mark(ptr->value);
14
14
  }
15
- VALUE node_alloc_internal(long index, long id, VALUE heap, VALUE priority, VALUE value){
15
+ VALUE node_alloc_internal(long index, long id, VALUE queue, VALUE priority, VALUE value){
16
16
  struct node *ptr = ALLOC(struct node);
17
17
  ptr->index = index;
18
18
  ptr->id = id;
19
- ptr->heap = heap;
19
+ ptr->queue = queue;
20
20
  ptr->priority = priority;
21
21
  ptr->value = value;
22
- return Data_Wrap_Struct(node_class, node_mark, -1, ptr);
22
+ return Data_Wrap_Struct(node_class, node_mark, RUBY_DEFAULT_FREE, ptr);
23
23
  }
24
24
  #define NODE_PREPARE(self, name) struct node *name;Data_Get_Struct(self, struct node, name);
25
25
  VALUE node_pri(VALUE self){
@@ -30,10 +30,6 @@ VALUE node_val(VALUE self){
30
30
  NODE_PREPARE(self, ptr);
31
31
  return ptr->value;
32
32
  }
33
- VALUE node_val_set(VALUE self, VALUE val){
34
- NODE_PREPARE(self, ptr);
35
- return ptr->value = val;
36
- }
37
33
  VALUE node_inspect(VALUE self){
38
34
  NODE_PREPARE(self, nptr);
39
35
  VALUE str = rb_str_buf_new(0);
@@ -48,6 +44,7 @@ VALUE node_inspect(VALUE self){
48
44
 
49
45
  struct queue_data{
50
46
  long counter;
47
+ int compare_sgn;
51
48
  VALUE heap, compare_by;
52
49
  };
53
50
 
@@ -60,17 +57,25 @@ long compare(VALUE a, VALUE b){
60
57
  }
61
58
  if(RB_TYPE_P(a, T_STRING)&&RB_TYPE_P(b, T_STRING))
62
59
  return rb_str_cmp(a, b);
63
- return rb_fix2long(rb_funcall(a, id_cmp, 1, b));
60
+ VALUE cmp = rb_funcall(a, id_cmp, 1, b);
61
+ if(NIL_P(cmp))rb_cmperr(a,b);
62
+ return rb_fix2long(cmp);
64
63
  }
64
+
65
65
  long compare_id(long a, long b){return a>b?1:a<b?-1:0;}
66
- void heap_mark(struct queue_data *st){
67
- rb_gc_mark(st->heap);
68
- rb_gc_mark(st->compare_by);
66
+
67
+ #define QUEUE_PREPARE(self, name) struct queue_data *name;Data_Get_Struct(self, struct queue_data, name);
68
+ #define OPTHASH_GIVEN_P(opts) (argc > 0 && !NIL_P((opts) = rb_check_hash_type(argv[argc-1])) && (--argc, 1))
69
+
70
+ void queue_mark(struct queue_data *self){
71
+ rb_gc_mark(self->heap);
72
+ rb_gc_mark(self->compare_by);
69
73
  }
70
- void heap_free(struct queue_data *st){free(st);}
71
- VALUE heap_alloc(VALUE klass){
74
+
75
+ VALUE queue_alloc(VALUE klass){
72
76
  struct queue_data *ptr=ALLOC(struct queue_data);
73
77
  ptr->counter = 0;
78
+ ptr->compare_sgn = 1;
74
79
  ptr->heap = rb_ary_new_capa(1);
75
80
  rb_ary_push(ptr->heap, Qnil);
76
81
  if(rb_block_given_p()){
@@ -78,13 +83,35 @@ VALUE heap_alloc(VALUE klass){
78
83
  }else{
79
84
  ptr->compare_by = Qnil;
80
85
  }
81
- return Data_Wrap_Struct(klass, heap_mark, heap_free, ptr);
86
+ return Data_Wrap_Struct(klass, queue_mark, RUBY_DEFAULT_FREE, ptr);
82
87
  }
83
88
 
84
- #define QUEUE_PREPARE(self, name) struct queue_data *name;Data_Get_Struct(self, struct queue_data, name);
89
+ VALUE queue_initialize(int argc, VALUE *argv, VALUE self){
90
+ QUEUE_PREPARE(self, ptr);
91
+ VALUE opts, order;
92
+ if(!OPTHASH_GIVEN_P(opts))return self;
93
+ ID keyword_ids[] = {id_order};
94
+ rb_get_kwargs(opts, keyword_ids, 0, 1, &order);
95
+ if(order == Qundef)return self;
96
+ if(order == ID2SYM(id_max)){
97
+ ptr->compare_sgn = -1;
98
+ }else if(order != ID2SYM(id_min)){
99
+ rb_raise(rb_eArgError, "order should be :min or :max");
100
+ }
101
+ return self;
102
+ }
85
103
 
86
- void heap_up(VALUE self, VALUE node){
104
+ VALUE queue_clear(VALUE self){
87
105
  QUEUE_PREPARE(self, ptr);
106
+ ptr->counter = 0;
107
+ rb_ary_clear(ptr->heap);
108
+ rb_ary_push(ptr->heap, Qnil);
109
+ return self;
110
+ }
111
+
112
+ void queue_up(VALUE self, VALUE node){
113
+ QUEUE_PREPARE(self, ptr);
114
+ int sgn = ptr->compare_sgn;
88
115
  RARRAY_PTR_USE(ptr->heap, heap, {
89
116
  NODE_PREPARE(node, nptr);
90
117
  long index = nptr->index;
@@ -92,8 +119,8 @@ void heap_up(VALUE self, VALUE node){
92
119
  long pindex = index/2;
93
120
  VALUE pnode = heap[pindex];
94
121
  NODE_PREPARE(pnode, pptr);
95
- long cmp = compare(pptr->priority, nptr->priority);
96
- if(!cmp)cmp=compare_id(pptr->id, nptr->id);
122
+ long cmp = compare(pptr->priority, nptr->priority)*sgn;
123
+ if(!cmp)cmp=compare_id(pptr->id, nptr->id)*sgn;
97
124
  if(cmp<0)break;
98
125
  pptr->index = index;
99
126
  heap[index] = pnode;
@@ -104,8 +131,9 @@ void heap_up(VALUE self, VALUE node){
104
131
  });
105
132
  }
106
133
 
107
- void heap_down(VALUE self, VALUE node){
134
+ void queue_down(VALUE self, VALUE node){
108
135
  QUEUE_PREPARE(self, ptr);
136
+ int sgn = ptr->compare_sgn;
109
137
  long length = RARRAY_LEN(ptr->heap);
110
138
  RARRAY_PTR_USE(ptr->heap, heap, {
111
139
  NODE_PREPARE(node, nptr);
@@ -117,16 +145,16 @@ void heap_down(VALUE self, VALUE node){
117
145
  if(lindex+1 < length){
118
146
  VALUE rnode = heap[lindex+1];
119
147
  NODE_PREPARE(rnode, rptr);
120
- long cmp = compare(lptr->priority, rptr->priority);
121
- if(!cmp)cmp=compare_id(lptr->id, rptr->id);
148
+ long cmp = compare(lptr->priority, rptr->priority)*sgn;
149
+ if(!cmp)cmp=compare_id(lptr->id, rptr->id)*sgn;
122
150
  if(cmp >= 0){
123
151
  lindex += 1;
124
152
  lnode = rnode;
125
153
  lptr = rptr;
126
154
  }
127
155
  }
128
- long cmp = compare(nptr->priority, lptr->priority);
129
- if(!cmp)cmp=compare_id(nptr->id, lptr->id);
156
+ long cmp = compare(nptr->priority, lptr->priority)*sgn;
157
+ if(!cmp)cmp=compare_id(nptr->id, lptr->id)*sgn;
130
158
  if(cmp <= 0)break;
131
159
  lptr->index = index;
132
160
  heap[index] = lnode;
@@ -137,10 +165,11 @@ void heap_down(VALUE self, VALUE node){
137
165
  });
138
166
  }
139
167
 
140
- VALUE heap_remove_node(VALUE self, VALUE node){
168
+ VALUE queue_remove_node(VALUE self, VALUE node){
141
169
  if(!rb_obj_is_kind_of(node, node_class))return Qnil;
142
170
  QUEUE_PREPARE(self, ptr);
143
171
  NODE_PREPARE(node, nptr);
172
+ int sgn = ptr->compare_sgn;
144
173
  long length = RARRAY_LEN(ptr->heap);
145
174
  if(nptr->index >= length || RARRAY_AREF(ptr->heap, nptr->index) != node)return Qnil;
146
175
  RARRAY_PTR_USE(ptr->heap, heap, {
@@ -149,12 +178,12 @@ VALUE heap_remove_node(VALUE self, VALUE node){
149
178
  NODE_PREPARE(replace_node, rptr);
150
179
  heap[nptr->index] = replace_node;
151
180
  rptr->index = nptr->index;
152
- long cmp = compare(rptr->priority, nptr->priority);
153
- if(!cmp)cmp = compare_id(rptr->id, nptr->id);
181
+ long cmp = compare(rptr->priority, nptr->priority)*sgn;
182
+ if(!cmp)cmp = compare_id(rptr->id, nptr->id)*sgn;
154
183
  if(cmp > 0){
155
- heap_down(nptr->heap, replace_node);
184
+ queue_down(nptr->queue, replace_node);
156
185
  }else{
157
- heap_up(nptr->heap, replace_node);
186
+ queue_up(nptr->queue, replace_node);
158
187
  }
159
188
  });
160
189
  return Qnil;
@@ -162,29 +191,48 @@ VALUE heap_remove_node(VALUE self, VALUE node){
162
191
 
163
192
  VALUE node_remove(VALUE self){
164
193
  NODE_PREPARE(self, nptr);
165
- heap_remove_node(nptr->heap, self);
194
+ queue_remove_node(nptr->queue, self);
166
195
  return Qnil;
167
196
  }
168
197
 
169
- VALUE node_update_priority(VALUE node, VALUE priority){
198
+ void node_update_priority_internal(VALUE node, VALUE priority){
170
199
  NODE_PREPARE(node, nptr);
171
- QUEUE_PREPARE(nptr->heap, ptr);
200
+ QUEUE_PREPARE(nptr->queue, ptr);
201
+ int sgn = ptr->compare_sgn;
172
202
  VALUE priority_was = nptr->priority;
173
203
  nptr->priority = priority;
174
- long cmp = compare(priority, priority_was);
175
- if(cmp == 0)return Qnil;
204
+ long cmp = compare(priority, priority_was)*sgn;
205
+ if(cmp == 0)return;
176
206
  RARRAY_PTR_USE(ptr->heap, heap, {
177
- if(heap[nptr->index] != node)return Qnil;
207
+ if(heap[nptr->index] != node)return;
178
208
  });
179
209
  if(cmp < 0){
180
- heap_up(nptr->heap, node);
210
+ queue_up(nptr->queue, node);
181
211
  }else{
182
- heap_down(nptr->heap, node);
212
+ queue_down(nptr->queue, node);
183
213
  }
184
- return Qnil;
185
214
  }
186
215
 
187
- VALUE heap_enq_vp(VALUE self, VALUE value, VALUE priority){
216
+ VALUE node_update_priority(VALUE node, VALUE priority){
217
+ NODE_PREPARE(node, nptr);
218
+ QUEUE_PREPARE(nptr->queue, ptr);
219
+ if(ptr->compare_by != Qnil)rb_raise(rb_eRuntimeError, "priority update not supported on queue initialized with block");
220
+ node_update_priority_internal(node, priority);
221
+ return priority;
222
+ }
223
+
224
+ VALUE node_update_value(VALUE node, VALUE value){
225
+ NODE_PREPARE(node, nptr);
226
+ QUEUE_PREPARE(nptr->queue, ptr);
227
+ nptr->value = value;
228
+ if(ptr->compare_by != Qnil){
229
+ VALUE priority = rb_funcall(ptr->compare_by, id_call, 1, value);
230
+ node_update_priority_internal(node, priority);
231
+ }
232
+ return value;
233
+ }
234
+
235
+ VALUE queue_enq_vp(VALUE self, VALUE value, VALUE priority){
188
236
  QUEUE_PREPARE(self, ptr);
189
237
  if(ptr->compare_by != Qnil){
190
238
  priority = rb_funcall(ptr->compare_by, id_call, 1, value);
@@ -193,14 +241,11 @@ VALUE heap_enq_vp(VALUE self, VALUE value, VALUE priority){
193
241
  VALUE node = node_alloc_internal(length, ptr->counter, self, priority, value);
194
242
  ptr->counter++;
195
243
  rb_ary_push(ptr->heap, node);
196
- heap_up(self, node);
244
+ queue_up(self, node);
197
245
  return node;
198
246
  }
199
247
 
200
- #define OPTHASH_GIVEN_P(opts) \
201
- (argc > 0 && !NIL_P((opts) = rb_check_hash_type(argv[argc-1])) && (--argc, 1))
202
-
203
- VALUE heap_enq(int argc, VALUE *argv, VALUE self){
248
+ VALUE queue_enq(int argc, VALUE *argv, VALUE self){
204
249
  VALUE value, opts, priority, pri = Qundef;
205
250
  if (OPTHASH_GIVEN_P(opts)) {
206
251
  ID keyword_ids[] = {id_priority};
@@ -208,18 +253,13 @@ VALUE heap_enq(int argc, VALUE *argv, VALUE self){
208
253
  }
209
254
  rb_scan_args(argc, argv, "1", &value);
210
255
  priority = (pri == Qundef) ? value : pri;
211
- return heap_enq_vp(self, value, priority);
212
- }
213
- VALUE heap_push(VALUE self, VALUE value){
214
- return heap_enq_vp(self, value, value);
256
+ return queue_enq_vp(self, value, priority);
215
257
  }
216
- VALUE heap_push_multiple(int argc, VALUE *argv, VALUE self){
217
- VALUE nodes = rb_ary_new_capa(argc);
218
- for(int i=0;i<argc;i++)rb_ary_push(nodes, heap_push(self, argv[i]));
219
- return nodes;
258
+ VALUE queue_push(VALUE self, VALUE value){
259
+ return queue_enq_vp(self, value, value);
220
260
  }
221
261
 
222
- VALUE heap_first_node(VALUE self){
262
+ VALUE queue_first_node(VALUE self){
223
263
  QUEUE_PREPARE(self, ptr);
224
264
  long length = RARRAY_LEN(ptr->heap);
225
265
  if(length == 1)return Qnil;
@@ -227,20 +267,20 @@ VALUE heap_first_node(VALUE self){
227
267
  return heap[1];
228
268
  });
229
269
  }
230
- VALUE heap_first(VALUE self){
231
- VALUE node = heap_first_node(self);
270
+ VALUE queue_first(VALUE self){
271
+ VALUE node = queue_first_node(self);
232
272
  if(node == Qnil)return Qnil;
233
273
  NODE_PREPARE(node, nptr);
234
274
  return nptr->value;
235
275
  }
236
- VALUE heap_first_with_priority(VALUE self){
237
- VALUE node = heap_first_node(self);
276
+ VALUE queue_first_with_priority(VALUE self){
277
+ VALUE node = queue_first_node(self);
238
278
  if(node == Qnil)return Qnil;
239
279
  NODE_PREPARE(node, nptr);
240
280
  return rb_ary_new_from_args(2, nptr->value, nptr->priority);
241
281
  }
242
282
 
243
- VALUE heap_deq_node(VALUE self){
283
+ VALUE queue_deq_node(VALUE self){
244
284
  QUEUE_PREPARE(self, ptr);
245
285
  long length = RARRAY_LEN(ptr->heap);
246
286
  if(length == 1)return Qnil;
@@ -250,14 +290,14 @@ VALUE heap_deq_node(VALUE self){
250
290
  NODE_PREPARE(node, nptr);
251
291
  if(length > 1){
252
292
  nptr->index = 1;
253
- heap_down(self, node);
293
+ queue_down(self, node);
254
294
  }
255
295
  return first;
256
296
  });
257
297
  }
258
- VALUE heap_deq(int argc, VALUE *argv, VALUE self){
298
+ VALUE queue_deq(int argc, VALUE *argv, VALUE self){
259
299
  if(argc == 0){
260
- VALUE node = heap_deq_node(self);
300
+ VALUE node = queue_deq_node(self);
261
301
  if(node == Qnil)return Qnil;
262
302
  NODE_PREPARE(node, nptr);
263
303
  return nptr->value;
@@ -271,33 +311,49 @@ VALUE heap_deq(int argc, VALUE *argv, VALUE self){
271
311
  if(n>length)n=length;
272
312
  VALUE result = rb_ary_new_capa(n);
273
313
  for(int i=0;i<n;i++){
274
- VALUE node = heap_deq_node(self);
314
+ VALUE node = queue_deq_node(self);
275
315
  NODE_PREPARE(node, nptr);
276
316
  rb_ary_push(result, nptr->value);
277
317
  }
278
318
  return result;
279
319
  }
280
320
  }
281
- VALUE heap_deq_with_priority(VALUE self){
282
- VALUE node = heap_deq_node(self);
321
+ VALUE queue_deq_with_priority(VALUE self){
322
+ VALUE node = queue_deq_node(self);
283
323
  if(node == Qnil)return Qnil;
284
324
  NODE_PREPARE(node, nptr);
285
325
  return rb_ary_new_from_args(2, nptr->value, nptr->priority);
286
326
  }
287
327
 
288
- VALUE heap_size(VALUE self){
328
+ VALUE queue_size(VALUE self){
289
329
  QUEUE_PREPARE(self, ptr);
290
330
  return LONG2FIX(RARRAY_LEN(ptr->heap)-1);
291
331
  }
292
- VALUE heap_is_empty(VALUE self){
332
+ VALUE queue_is_empty(VALUE self){
293
333
  QUEUE_PREPARE(self, ptr);
294
334
  return RARRAY_LEN(ptr->heap) == 1 ? Qtrue : Qfalse;
295
335
  }
296
- VALUE heap_inspect(VALUE self){
336
+ #define QUEUE_PTR_IS_MIN(ptr) ((ptr)->compare_sgn==1)
337
+ VALUE queue_is_min(VALUE self){
338
+ QUEUE_PREPARE(self, ptr);
339
+ return QUEUE_PTR_IS_MIN(ptr) ? Qtrue : Qfalse;
340
+ }
341
+ VALUE queue_is_max(VALUE self){
342
+ QUEUE_PREPARE(self, ptr);
343
+ return QUEUE_PTR_IS_MIN(ptr) ? Qfalse : Qtrue;
344
+ }
345
+ VALUE queue_inspect(VALUE self){
346
+ QUEUE_PREPARE(self, ptr);
297
347
  VALUE str = rb_str_buf_new(0);
298
348
  rb_str_buf_append(str, rb_class_name(CLASS_OF(self)));
299
- RB_STR_BUF_CAT(str, "{size: ");
300
- rb_str_buf_append(str, rb_inspect(heap_size(self)));
349
+ RB_STR_BUF_CAT(str, "{order: ");
350
+ if(QUEUE_PTR_IS_MIN(ptr)){
351
+ RB_STR_BUF_CAT(str, ":min");
352
+ }else{
353
+ RB_STR_BUF_CAT(str, ":max");
354
+ }
355
+ RB_STR_BUF_CAT(str, ", size: ");
356
+ rb_str_buf_append(str, rb_inspect(queue_size(self)));
301
357
  RB_STR_BUF_CAT(str, "}");
302
358
  return str;
303
359
  }
@@ -306,33 +362,43 @@ void Init_penguin_queue(void){
306
362
  id_priority = rb_intern("priority");
307
363
  id_call = rb_intern("call");
308
364
  id_cmp = rb_intern("<=>");
365
+ id_max = rb_intern("max");
366
+ id_min = rb_intern("min");
367
+ id_order = rb_intern("order");
309
368
 
310
- VALUE heap_class = rb_define_class("PenguinQueue", rb_cObject);
311
- rb_define_alloc_func(heap_class, heap_alloc);
312
- rb_define_method(heap_class, "size", heap_size, 0);
313
- rb_define_method(heap_class, "empty?", heap_is_empty, 0);
314
- rb_define_method(heap_class, "inspect", heap_inspect, 0);
315
- rb_define_method(heap_class, "first", heap_first, 0);
316
- rb_define_method(heap_class, "first_node", heap_first_node, 0);
317
- rb_define_method(heap_class, "first_with_priority", heap_first_with_priority, 0);
318
- rb_define_method(heap_class, "to_s", heap_inspect, 0);
319
- rb_define_method(heap_class, "push", heap_push_multiple, -1);
320
- rb_define_method(heap_class, "<<", heap_push, 1);
321
- rb_define_method(heap_class, "enq", heap_enq, -1);
322
- rb_define_method(heap_class, "unshift", heap_push_multiple, -1);
323
- rb_define_method(heap_class, "pop", heap_deq, -1);
324
- rb_define_method(heap_class, "shift", heap_deq, -1);
325
- rb_define_method(heap_class, "deq", heap_deq, -1);
326
- rb_define_method(heap_class, "deq_with_priority", heap_deq_with_priority, 0);
327
- rb_define_method(heap_class, "delete", heap_remove_node, 1);
328
- rb_define_method(heap_class, "remove", heap_remove_node, 1);
369
+ VALUE queue_class = rb_define_class("PenguinQueue", rb_cObject);
370
+ rb_define_alloc_func(queue_class, queue_alloc);
371
+ rb_define_method(queue_class, "initialize", queue_initialize, -1);
372
+ rb_define_method(queue_class, "size", queue_size, 0);
373
+ rb_define_method(queue_class, "empty?", queue_is_empty, 0);
374
+ rb_define_method(queue_class, "clear", queue_clear, 0);
375
+ rb_define_method(queue_class, "inspect", queue_inspect, 0);
376
+ rb_define_method(queue_class, "top", queue_first, 0);
377
+ rb_define_method(queue_class, "peek", queue_first, 0);
378
+ rb_define_method(queue_class, "first", queue_first, 0);
379
+ rb_define_method(queue_class, "first_node", queue_first_node, 0);
380
+ rb_define_method(queue_class, "first_with_priority", queue_first_with_priority, 0);
381
+ rb_define_method(queue_class, "to_s", queue_inspect, 0);
382
+ rb_define_method(queue_class, "push", queue_enq, -1);
383
+ rb_define_method(queue_class, "<<", queue_push, 1);
384
+ rb_define_method(queue_class, "enq", queue_enq, -1);
385
+ rb_define_method(queue_class, "unshift", queue_enq, -1);
386
+ rb_define_method(queue_class, "pop", queue_deq, -1);
387
+ rb_define_method(queue_class, "shift", queue_deq, -1);
388
+ rb_define_method(queue_class, "deq", queue_deq, -1);
389
+ rb_define_method(queue_class, "poll", queue_deq, -1);
390
+ rb_define_method(queue_class, "deq_with_priority", queue_deq_with_priority, 0);
391
+ rb_define_method(queue_class, "delete", queue_remove_node, 1);
392
+ rb_define_method(queue_class, "remove", queue_remove_node, 1);
393
+ rb_define_method(queue_class, "min?", queue_is_min, 0);
394
+ rb_define_method(queue_class, "max?", queue_is_max, 0);
329
395
 
330
- node_class = rb_define_class_under(heap_class, "Node", rb_cObject);
396
+ node_class = rb_define_class_under(queue_class, "Node", rb_cObject);
331
397
  rb_undef_alloc_func(node_class);
332
398
  rb_define_method(node_class, "priority", node_pri, 0);
333
399
  rb_define_method(node_class, "priority=", node_update_priority, 1);
334
400
  rb_define_method(node_class, "value", node_val, 0);
335
- rb_define_method(node_class, "value=", node_val_set, 1);
401
+ rb_define_method(node_class, "value=", node_update_value, 1);
336
402
  rb_define_method(node_class, "inspect", node_inspect, 0);
337
403
  rb_define_method(node_class, "to_s", node_inspect, 0);
338
404
  rb_define_method(node_class, "remove", node_remove, 0);
@@ -1,3 +1,3 @@
1
1
  class PenguinQueue
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: penguin_queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - tompng
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-02-19 00:00:00.000000000 Z
11
+ date: 2017-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler