6 int deq_resize_(struct deq *q, unsigned n)
10 assert(q && n > 0 && n >= q->len);
12 if (!(t = malloc(q->esz * n)))
16 unsigned part1 = q->head + q->len <= q->cap ? q->len : q->cap - q->head;
17 unsigned part2 = q->len - part1;
18 memcpy(t, q->v + q->head * q->esz, q->esz * part1);
20 memcpy(t + q->esz * part1, q->v, q->esz * part2);
33 int deq_op_(struct deq *q, enum deq_op op, unsigned *i)
36 assert(op == DEQ_PUSH || op == DEQ_POP || op == DEQ_SHIFT || op == DEQ_UNSHIFT);
41 if (q->len == q->cap && deq_resize_(q, q->cap == 0 ? q->min : q->cap * 2) == -1)
46 if (q->cap > q->min) {
47 if (q->shrink == DEQ_SHRINK_IF_EMPTY && q->len == 1 && deq_resize_(q, q->min) == -1)
49 if (q->shrink == DEQ_SHRINK_AT_20PCT && (q->len - 1) * 5 <= q->cap && deq_resize_(q, q->cap / 2) == -1)
68 q->tail = (q->tail == 0 ? q->cap : q->tail) - 1;
73 q->head = (q->head == 0 ? q->cap : q->head) - 1;
82 void deq_reset_(struct deq *q)
90 q->head = q->tail = q->len = q->cap = 0;