/*
* call-seq:
* PriorityQueue.new(capacity = 32) -> new_pq
* PriorityQueue.new({:capacity => 32,
* :less_than_proc => lambda{|a, b| a < b}) -> new_pq
* PriorityQueue.new({:capacity => 32}) {|a, b| a < b} -> new_pq
*
* Returns a new empty priority queue object with an optional capacity.
* Once the capacity is filled, the lowest valued elements will be
* automatically popped off the top of the queue as more elements are
* inserted into the queue.
*/
static VALUE
frt_pq_init(int argc, VALUE *argv, VALUE self)
{
if (argc >= 1) {
PriQ *pq;
VALUE options = argv[0];
VALUE param;
int capa = PQ_START_CAPA;
GET_PQ(pq, self);
switch (TYPE(options)) {
case T_FIXNUM:
capa = FIX2INT(options);
break;
case T_HASH:
if (!NIL_P(param = rb_hash_aref(options,
ID2SYM(id_capacity)))) {
capa = FIX2INT(param);
}
if (!NIL_P(param = rb_hash_aref(options,
ID2SYM(id_less_than)))) {
pq->proc = param;
}
break;
default:
rb_raise(rb_eArgError,
"PriorityQueue#initialize only takes a Hash or "
"an integer");
break;
}
if (capa < 0) {
rb_raise(rb_eIndexError,
"PriorityQueue must have a capacity > 0. %d < 0",
capa);
}
pq->capa = capa;
if (rb_block_given_p()) {
pq->proc = rb_block_proc();
}
if (argc > 1) {
rb_raise(rb_eArgError,
"PriorityQueue#initialize only takes one parameter");
}
}
return self;
}