Feature #11518 ยป ruby_queue_promote.patch
| ChangeLog (working copy) | ||
|---|---|---|
|
Tue Sep 9 02:43:13 2015 Jonathan Cruz <jcruz@trustwave.com>
|
||
|
* thread_sync.c: Add Queue#promote! and Queue#promote_all!
|
||
|
Promotes elements to the front of the queue for which the provided
|
||
|
block returns a truthy value. #promote! only applies to the first
|
||
|
such element. #promote_all! applies to all matching elements,
|
||
|
maintaining their relative order.
|
||
|
Thu Sep 3 21:12:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||
|
* lib/cgi/session.rb (create_new_id): use SHA512 instead of MD5.
|
||
| thread_sync.c (working copy) | ||
|---|---|---|
|
}
|
||
|
/*
|
||
|
* Document-method: Queue#promote!
|
||
|
* call-seq: promote!
|
||
|
*
|
||
|
* Promotes first object to the front of the queue for which the given +block+
|
||
|
* returns a true value.
|
||
|
*/
|
||
|
static VALUE
|
||
|
rb_queue_promote(VALUE self)
|
||
|
{
|
||
|
if (!rb_block_given_p()) {
|
||
|
rb_raise(rb_eThreadError, "must be called with a block");
|
||
|
}
|
||
|
return queue_do_promote(self, FALSE);
|
||
|
}
|
||
|
/*
|
||
|
* Document-method: Queue#promote_all!
|
||
|
* call-seq: promote_all!
|
||
|
*
|
||
|
*
|
||
|
* Promotes all objects to the front of the queue for which the given +block+
|
||
|
* returns a true value, preserving their relative order.
|
||
|
*/
|
||
|
static VALUE
|
||
|
rb_queue_promote_all(VALUE self)
|
||
|
{
|
||
|
if (!rb_block_given_p()) {
|
||
|
rb_raise(rb_eThreadError, "must be called with a block");
|
||
|
}
|
||
|
return queue_do_promote(self, TRUE);
|
||
|
}
|
||
|
static VALUE
|
||
|
queue_do_promote(VALUE self, int promote_all)
|
||
|
{
|
||
|
VALUE que = GET_QUEUE_QUE(self);
|
||
|
VALUE promote = rb_ary_new2(RARRAY_LEN(que));
|
||
|
long i;
|
||
|
for (i = 0; i < RARRAY_LEN(que); i++) {
|
||
|
VALUE obj = RARRAY_AREF(que, i);
|
||
|
if (RTEST(rb_yield(obj))) {
|
||
|
rb_ary_unshift(promote, obj);
|
||
|
if (!promote_all) break;
|
||
|
}
|
||
|
}
|
||
|
for (i = 0; i < RARRAY_LEN(promote); i++) {
|
||
|
VALUE obj = RARRAY_AREF(promote, i);
|
||
|
rb_ary_delete(que, obj);
|
||
|
rb_ary_unshift(que, obj);
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
/*
|
||
|
* Document-class: SizedQueue
|
||
|
*
|
||
|
* This class represents queues of specified size capacity. The push operation
|
||
| ... | ... | |
|
rb_define_method(rb_cQueue, "clear", rb_queue_clear, 0);
|
||
|
rb_define_method(rb_cQueue, "length", rb_queue_length, 0);
|
||
|
rb_define_method(rb_cQueue, "num_waiting", rb_queue_num_waiting, 0);
|
||
|
rb_define_method(rb_cQueue, "promote!", rb_queue_promote, 0);
|
||
|
rb_define_method(rb_cQueue, "promote_all!", rb_queue_promote_all, 0);
|
||
|
rb_define_alias(rb_cQueue, "enq", "push"); /* Alias for #push. */
|
||
|
rb_define_alias(rb_cQueue, "<<", "push"); /* Alias for #push. */
|
||