1 /* Licensed under Apache License v2.0 - see LICENSE file for details */
8 int deq_resize_(struct deq *q, unsigned n)
12 assert(q && n > 0 && n >= q->len);
14 if (!(t = malloc(q->esz * n)))
18 unsigned part1 = q->head + q->len <= q->cap ? q->len : q->cap - q->head;
19 unsigned part2 = q->len - part1;
20 memcpy(t, q->v + q->head * q->esz, q->esz * part1);
22 memcpy(t + q->esz * part1, q->v, q->esz * part2);
35 int deq_op_(struct deq *q, enum deq_op op, unsigned *i)
38 assert(op == DEQ_PUSH || op == DEQ_POP || op == DEQ_SHIFT || op == DEQ_UNSHIFT);
43 if (q->len == q->cap && deq_resize_(q, q->cap == 0 ? q->min : q->cap * 2) == -1)
48 if (q->cap > q->min) {
49 if (q->shrink == DEQ_SHRINK_IF_EMPTY && q->len == 1 && deq_resize_(q, q->min) == -1)
51 if (q->shrink == DEQ_SHRINK_AT_20PCT && (q->len - 1) * 5 <= q->cap && deq_resize_(q, q->cap / 2) == -1)
70 q->tail = (q->tail == 0 ? q->cap : q->tail) - 1;
75 q->head = (q->head == 0 ? q->cap : q->head) - 1;
84 void deq_reset_(struct deq *q)
92 q->head = q->tail = q->len = q->cap = 0;