int reinit_queue(QUEUE *queue, uint max_elements, uint offset_to_key, pbool max_at_top, int (*compare) (void *, uchar *, uchar *), void *first_cmp_arg) { DBUG_ENTER("reinit_queue"); queue->elements=0; queue->compare=compare; queue->first_cmp_arg=first_cmp_arg; queue->offset_to_key=offset_to_key; queue_set_max_at_top(queue, max_at_top); resize_queue(queue, max_elements); DBUG_RETURN(0); }
int queue_insert_safe(register QUEUE *queue, uchar *element) { if (queue->elements == queue->max_elements) { if (!queue->auto_extent) return 2; else if (resize_queue(queue, queue->max_elements + queue->auto_extent)) return 1; } queue_insert(queue, element); return 0; }
/* * Push element p at the end of the queue */ void ptr_queue_push(ptr_queue_t *q, void *p) { uint32_t i, n, j; i = q->tail; q->data[i] = p; i ++; q->tail = i; if (i == q->size) { if (q->head == 0) { /* * full queue, stored in data[0...size-1], * just increase the size */ resize_queue(q); } else { q->tail = 0; } } else if (i == q->head) { /* * full queue, stored in data[0..i-1][head .. size-1] * increase the size and shift data[head .. size - 1] to the end * of the new data array. */ n = q->size; resize_queue(q); j = q->size; assert(n < j); do { n --; j --; q->data[j] = q->data[n]; } while (n > i); q->head = j; } }
static inline void insert_into_queue(state_ptr new_state, queue the_queue) { int index; if (!the_queue->queue_size || the_queue->queue_size == the_queue->num_elements) resize_queue(the_queue); the_queue->data_array[the_queue->num_elements] = new_state; the_queue->num_elements++; /* Fix up priority queue */ index = the_queue->num_elements; while (index > 1 && get_parent_value(the_queue, index) > new_state->utility) { swap_entries(carmen_trunc(index/2), index, the_queue); index = carmen_trunc(index/2); } }