rb_lovely 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/rb_lovely/sorted_hash.cpp +33 -36
- data/yard.rb +53 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5d7473f46f078962567e35e26f31e444a221cbd
|
4
|
+
data.tar.gz: 8ed3631fc234e853cae5cd35d3dbe16db41af6bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aebd51f11653b4fcb7c198d54405d6d2394f624fa57dab474de57b34806c54f588fb29b3dc172a0538ef59993aab3f236363c28b925afa84582a0dcc14f225d3
|
7
|
+
data.tar.gz: d3f14f1f337dfe379f0d9b279e02d6b2cf068b55d3e1a3263060c22b3d14617138c6e0e4a1d95e933b2d3a169e439077f21e8b51eedf4cf7e12b88b4ef424e28
|
@@ -228,19 +228,31 @@ VALUE hashDelete(VALUE self, VALUE toDelete) {
|
|
228
228
|
}
|
229
229
|
}
|
230
230
|
|
231
|
+
enum class ValueOrKey { VALUE, KEY, BOTH };
|
232
|
+
|
233
|
+
template <ValueOrKey V>
|
231
234
|
VALUE hashShift(VALUE self) {
|
232
235
|
Hash* hash = rubyCast<Hash>(self);
|
233
236
|
if (hash->container.empty())
|
234
237
|
return Qnil;
|
235
238
|
|
236
239
|
auto& idx = hash->container.get<1>();
|
237
|
-
auto
|
238
|
-
|
239
|
-
|
240
|
+
auto first = idx.begin();
|
241
|
+
if (V == ValueOrKey::BOTH) {
|
242
|
+
auto keyBak = first->key;
|
243
|
+
auto valBak = first->val;
|
244
|
+
idx.erase(first);
|
240
245
|
|
241
|
-
|
246
|
+
return rb_ary_new3(2, keyBak, valBak);
|
247
|
+
}
|
248
|
+
else {
|
249
|
+
auto bak = V == ValueOrKey::VALUE ? first->val : first->key;
|
250
|
+
idx.erase(first);
|
251
|
+
return bak;
|
252
|
+
}
|
242
253
|
}
|
243
254
|
|
255
|
+
template <ValueOrKey V>
|
244
256
|
VALUE hashPop(VALUE self) {
|
245
257
|
Hash* hash = rubyCast<Hash>(self);
|
246
258
|
if (hash->container.empty())
|
@@ -249,35 +261,18 @@ VALUE hashPop(VALUE self) {
|
|
249
261
|
auto& idx = hash->container.get<1>();
|
250
262
|
auto last = idx.end();
|
251
263
|
--last;
|
252
|
-
auto keyBak = last->key;
|
253
|
-
auto valBak = last->val;
|
254
|
-
idx.erase(last);
|
255
|
-
|
256
|
-
return rb_ary_new3(2, keyBak, valBak);
|
257
|
-
}
|
258
264
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
VALUE hashPopValue(VALUE self) {
|
271
|
-
Hash* hash = rubyCast<Hash>(self);
|
272
|
-
if (hash->container.empty())
|
273
|
-
return Qnil;
|
274
|
-
|
275
|
-
auto& idx = hash->container.get<1>();
|
276
|
-
auto last = idx.end();
|
277
|
-
--last;
|
278
|
-
auto bak = last->val;
|
279
|
-
idx.erase(last);
|
280
|
-
return bak;
|
265
|
+
if (V == ValueOrKey::BOTH) {
|
266
|
+
auto keyBak = last->key;
|
267
|
+
auto valBak = last->val;
|
268
|
+
idx.erase(last);
|
269
|
+
return rb_ary_new3(2, keyBak, valBak);
|
270
|
+
}
|
271
|
+
else {
|
272
|
+
auto bak = V == ValueOrKey::VALUE ? last->val : last->key;
|
273
|
+
idx.erase(last);
|
274
|
+
return bak;
|
275
|
+
}
|
281
276
|
}
|
282
277
|
|
283
278
|
VALUE hashHas(VALUE self, VALUE key) {
|
@@ -324,10 +319,12 @@ extern "C" {
|
|
324
319
|
// rb_define_method(rbHash, "reject!", RUBY_METHOD_FUNC(hashMutatingReject), 0);
|
325
320
|
// rb_define_method(rbHash, "reject_first!", RUBY_METHOD_FUNC(hashMutatingRejectFirst), 0);
|
326
321
|
// rb_define_method(rbHash, "select!", RUBY_METHOD_FUNC(hashMutatingSelect), 0);
|
327
|
-
rb_define_method(rbHash, "shift", RUBY_METHOD_FUNC(hashShift), 0);
|
328
|
-
rb_define_method(rbHash, "
|
329
|
-
rb_define_method(rbHash, "
|
330
|
-
rb_define_method(rbHash, "
|
322
|
+
rb_define_method(rbHash, "shift", RUBY_METHOD_FUNC(hashShift<ValueOrKey::BOTH>), 0);
|
323
|
+
rb_define_method(rbHash, "shift_value", RUBY_METHOD_FUNC(hashShift<ValueOrKey::VALUE>), 0);
|
324
|
+
rb_define_method(rbHash, "shift_key", RUBY_METHOD_FUNC(hashShift<ValueOrKey::KEY>), 0);
|
325
|
+
rb_define_method(rbHash, "pop", RUBY_METHOD_FUNC(hashPop<ValueOrKey::BOTH>), 0);
|
326
|
+
rb_define_method(rbHash, "pop_value", RUBY_METHOD_FUNC(hashPop<ValueOrKey::VALUE>), 0);
|
327
|
+
rb_define_method(rbHash, "pop_key", RUBY_METHOD_FUNC(hashPop<ValueOrKey::KEY>), 0);
|
331
328
|
// Enumerable would test both key and value for include?
|
332
329
|
rb_define_method(rbHash, "include?", RUBY_METHOD_FUNC(hashHas), 1);
|
333
330
|
rb_define_method(rbHash, "has_key?", RUBY_METHOD_FUNC(hashHas), 1);
|
data/yard.rb
CHANGED
@@ -248,10 +248,10 @@ module RbLovely
|
|
248
248
|
# @complexity O(c)
|
249
249
|
# @example
|
250
250
|
# @set = RbLovely::SortedHash [:a, 2, :b, 1]
|
251
|
-
# expect(@set.first).to
|
251
|
+
# expect(@set.first).to eql [:b, 1]
|
252
252
|
def first ; end
|
253
253
|
|
254
|
-
# Retrieve
|
254
|
+
# Retrieve first value as determined by value sort order or nil if the hash is empty.
|
255
255
|
# @complexity O(c)
|
256
256
|
# @return [Array] The first key-value pair in the hash.
|
257
257
|
# @example
|
@@ -259,6 +259,14 @@ module RbLovely
|
|
259
259
|
# expect(@set.first_value).to equal 1
|
260
260
|
def first_value ; end
|
261
261
|
|
262
|
+
# Retrieve first key as determined by value sort order or nil if the hash is empty.
|
263
|
+
# @complexity O(c)
|
264
|
+
# @return The first key in the hash
|
265
|
+
# @example
|
266
|
+
# @set = RbLovely::SortedHash [:a, 1, :b, 2]
|
267
|
+
# expect(@set.first_value).to equal :a
|
268
|
+
def first_key ; end
|
269
|
+
|
262
270
|
# Retrieve last key-value pair as determined by value sort order or nil if the hash is empty.
|
263
271
|
# @complexity O(c)
|
264
272
|
# @return [Array] The last key-value pair in the hash.
|
@@ -274,6 +282,13 @@ module RbLovely
|
|
274
282
|
# expect(@set.last_value).to equal 2
|
275
283
|
def last_value ; end
|
276
284
|
|
285
|
+
# Retrieve last key as determined by value sort order or nil if the hash is empty.
|
286
|
+
# @complexity O(c)
|
287
|
+
# @example
|
288
|
+
# @set = RbLovely::SortedHash [:a, 1, :b, 2]
|
289
|
+
# expect(@set.last_key).to equal :b
|
290
|
+
def last_key ; end
|
291
|
+
|
277
292
|
# Remove the first key-value pair in the hash and return it or return nil if the hash is empty.
|
278
293
|
# @complexity O(c).
|
279
294
|
# @see #pop
|
@@ -283,6 +298,24 @@ module RbLovely
|
|
283
298
|
# expect(hash.shift).to equal [:a, 2]
|
284
299
|
def shift ; end
|
285
300
|
|
301
|
+
# Remove the first key-value pair in the hash and return the key or return nil if the hash is empty.
|
302
|
+
# @complexity O(c).
|
303
|
+
# @see #pop_key
|
304
|
+
# @return The first key pair according to the <=> method defined on each member or nil if the hash is empty.
|
305
|
+
# @example
|
306
|
+
# set = RbLovely::SortedHash [:a, 2, :b, 10]
|
307
|
+
# expect(hash.shift_key).to equal :a
|
308
|
+
def shift_key ; end
|
309
|
+
|
310
|
+
# Remove the first key-value pair in the hash and return the value or return nil if the hash is empty.
|
311
|
+
# @complexity O(c).
|
312
|
+
# @see #pop_value
|
313
|
+
# @return The first key pair according to the <=> method defined on each member or nil if the hash is empty.
|
314
|
+
# @example
|
315
|
+
# set = RbLovely::SortedHash [:a, 2, :b, 10]
|
316
|
+
# expect(hash.shift_value).to equal 2
|
317
|
+
def shift_value ; end
|
318
|
+
|
286
319
|
# Remove the last key-value pair in the hash and return it or return nil if the hash is empty.
|
287
320
|
# @complexity O(c).
|
288
321
|
# @see #shift
|
@@ -292,6 +325,24 @@ module RbLovely
|
|
292
325
|
# expect(hash.pop).to equal [:b, 10]
|
293
326
|
def pop ; end
|
294
327
|
|
328
|
+
# Remove the last key-value pair in the hash and return the key or return nil if the hash is empty.
|
329
|
+
# @complexity O(c).
|
330
|
+
# @see #shift_key
|
331
|
+
# @return The last key according to the <=> method defined on each member or nil if the hash is empty.
|
332
|
+
# @example
|
333
|
+
# set = RbLovely::SortedHash [:a, 2, :b, 10]
|
334
|
+
# expect(hash.pop_key).to equal :b
|
335
|
+
def pop_key ; end
|
336
|
+
|
337
|
+
# Remove the last key-value pair in the hash and return the value or return nil if the hash is empty.
|
338
|
+
# @complexity O(c).
|
339
|
+
# @see #shift_value
|
340
|
+
# @return The last key according to the <=> method defined on each member or nil if the hash is empty.
|
341
|
+
# @example
|
342
|
+
# set = RbLovely::SortedHash [:a, 2, :b, 10]
|
343
|
+
# expect(hash.pop_value).to equal 10
|
344
|
+
def pop_value ; end
|
345
|
+
|
295
346
|
# Remove the first key-value pair in the hash and return it or return nil if the hash is empty.
|
296
347
|
# @complexity O(c).
|
297
348
|
# @see #pop_value
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rb_lovely
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Pike
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A fast sorted set built using std::set and a fast sorted hash built using
|
14
14
|
boost::multi_index_container.
|