// Hidden header style array. (2.00)
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// Utility.
#define MAX(a, b) \
({ __auto_type _x = (a); __auto_type _y = (b); \
(_y > _x) ? _y : _x; })
// Array (private).
typedef struct {
size_t size, capacity;
} _Header;
#define _PTR_TO_HDR(p) ((_Header*)((char*)p - sizeof(_Header)))
#define _HDR_TO_PTR(p) ((void*)((char*)p + sizeof(_Header)))
void *_ar_reserve(void *p, size_t capacity, size_t itemsize)
{
_Header *self = _PTR_TO_HDR(p);
if (capacity > self->capacity)
{
self
= realloc(self
, sizeof *self
+ capacity
*itemsize
); self->capacity = capacity;
}
return _HDR_TO_PTR(self);
}
void *_ar_resize(void *p, size_t size, size_t itemsize)
{
p = _ar_reserve(p, size, itemsize);
_PTR_TO_HDR(p)->size = size;
return p;
}
void _ar_free(void *p)
{
if (p != 0)
}
void *_ar_init(void)
{
_Header
*self
= malloc(sizeof *self
); self->size = 0;
self->capacity = 0;
return _HDR_TO_PTR(self);
}
const void *_ar_at_c(const void *p, ptrdiff_t i, size_t itemsize)
{
ptrdiff_t size = _PTR_TO_HDR(p)->size;
if (i < 0)
i += size;
return (const char*)p + i*itemsize;
}
void *_ar_at(void *p, ptrdiff_t i, size_t itemsize)
{
return (void*)_ar_at_c(p, i, itemsize);
}
void _ar_remove(void *p, size_t i, size_t n, size_t itemsize)
{
_Header *self = _PTR_TO_HDR(p);
if (n != 0)
{
size_t oldsize = self->size;
size_t j = i + n;
if (oldsize > j)
memmove(_ar_at
(p
, i
, itemsize
), _ar_at
(p
, j
, itemsize
), (oldsize
- j
)*itemsize
); self->size = oldsize - n;
}
}
void *_ar_insert(void *p, size_t i, const void *first, size_t n, size_t itemsize)
{
_Header *self = _PTR_TO_HDR(p);
if (n != 0)
{
size_t oldsize = self->size;
size_t newsize = oldsize + n;
if (newsize > self->capacity)
{
p = _ar_reserve(p, MAX(2*self->capacity, newsize), itemsize);
self = _PTR_TO_HDR(p);
}
self->size = newsize;
void *ip = _ar_at(p, i, itemsize);
if (oldsize > i)
memmove(_ar_at
(p
, i
+ n
, itemsize
), ip
, (oldsize
- i
)*itemsize
); memcpy(ip
, first
, n
*itemsize
); }
return p;
}
void *_ar_append(void *p, const void *item, size_t itemsize)
{
return _ar_insert(p, _PTR_TO_HDR(p)->size, item, 1, itemsize);
}
// Array (public).
void ar_pop(void *p)
{
_Header *self = _PTR_TO_HDR(p);
self->size--;
}
void ar_clear(void *p)
{
_PTR_TO_HDR(p)->size = 0;
}
size_t ar_size(const void *p)
{
return _PTR_TO_HDR(p)->size;
}
size_t ar_capacity(const void *p)
{
return _PTR_TO_HDR(p)->capacity;
}
#define ar_init(a) ((a) = _ar_init())
#define ar_free(a) (_ar_free(a), (a) = 0)
#define ar_reserve(a, n) ((a) = _ar_reserve(a, n, sizeof *(a)))
#define ar_resize(a, n) ((a) = _ar_resize(a, n, sizeof *(a)))
#define ar_at(a, i) (((__typeof__(*(a))*)_ar_at(a, i, sizeof *(a)))[0])
#define ar_at_c(a, i) (((const __typeof__(*(a))*)_ar_at_c(a, i, sizeof *(a)))[0])
#define ar_remove(a, i, n) _ar_remove(a, i, n, sizeof *(a))
#define ar_insert(a, i, s, n) ((a) = _ar_insert(a, i, s, n, sizeof *(a)))
#define ar_append(a, v) ((a) = _ar_append(a, (__typeof__(*(a))[]){v}, sizeof *(a)))
// Main.
void ar_print(const int *p)
{
printf("size;capacity: %zu;%zu: [", ar_size
(p
), ar_capacity
(p
)); for (size_t i = 0; i < ar_size(p); i++)
{
}
}
int main(void)
{
int *p = 0;
// Init
ar_init(p);
ar_print(p);
// Append
for (int i = 0; i < 4; i++)
{
ar_append(p, i);
ar_print(p);
}
// At
for (int i = 0; i < 4; i++)
{
assert(p
[ar_size
(p
)-1-i
] == ar_at
(p
, -1-i
)); }
// Insert/Remove
ar_insert(p, 2, ((int[]){1111, 2222}), 2); // middle
ar_print(p);
ar_remove(p, 2, 2);
ar_print(p);
ar_insert(p, 0, ((int[]){-3, -2, -1}), 3); // front
ar_print(p);
ar_remove(p, 0, 3);
ar_print(p);
ar_insert(p, ar_size(p), ((int[]){5, 6, 7, 8}), 4); // back
ar_print(p);
ar_remove(p, ar_size(p)-4, 4);
ar_print(p);
// Pop
while (ar_size(p) != 0)
{
ar_pop(p);
ar_print(p);
}
// Free
ar_free(p);
return 0;
}
Ly8gSGlkZGVuIGhlYWRlciBzdHlsZSBhcnJheS4gKDIuMDApCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKLy8gVXRpbGl0eS4KCiNkZWZpbmUgTUFYKGEsIGIpIFwKKHsgX19hdXRvX3R5cGUgX3ggPSAoYSk7IF9fYXV0b190eXBlIF95ID0gKGIpOyBcCiAgIChfeSA+IF94KSA/IF95IDogX3g7IH0pCgovLyBBcnJheSAocHJpdmF0ZSkuCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBzaXplX3Qgc2l6ZSwgY2FwYWNpdHk7Cn0gX0hlYWRlcjsKCiNkZWZpbmUgX1BUUl9UT19IRFIocCkgKChfSGVhZGVyKikoKGNoYXIqKXAgLSBzaXplb2YoX0hlYWRlcikpKQojZGVmaW5lIF9IRFJfVE9fUFRSKHApICgodm9pZCopKChjaGFyKilwICsgc2l6ZW9mKF9IZWFkZXIpKSkKCnZvaWQgKl9hcl9yZXNlcnZlKHZvaWQgKnAsIHNpemVfdCBjYXBhY2l0eSwgc2l6ZV90IGl0ZW1zaXplKQp7CiAgICBhc3NlcnQocCAhPSAwKTsKICAgIF9IZWFkZXIgKnNlbGYgPSBfUFRSX1RPX0hEUihwKTsKCiAgICBpZiAoY2FwYWNpdHkgPiBzZWxmLT5jYXBhY2l0eSkKICAgIHsKICAgICAgICBzZWxmID0gcmVhbGxvYyhzZWxmLCBzaXplb2YgKnNlbGYgKyBjYXBhY2l0eSppdGVtc2l6ZSk7CiAgICAgICAgYXNzZXJ0KHNlbGYgIT0gMCk7CiAgICAgICAgc2VsZi0+Y2FwYWNpdHkgPSBjYXBhY2l0eTsKICAgIH0KICAgIHJldHVybiBfSERSX1RPX1BUUihzZWxmKTsKfQoKdm9pZCAqX2FyX3Jlc2l6ZSh2b2lkICpwLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGl0ZW1zaXplKQp7CiAgICBhc3NlcnQocCAhPSAwKTsKICAgIHAgPSBfYXJfcmVzZXJ2ZShwLCBzaXplLCBpdGVtc2l6ZSk7CiAgICBfUFRSX1RPX0hEUihwKS0+c2l6ZSA9IHNpemU7CiAgICByZXR1cm4gcDsKfQoKdm9pZCBfYXJfZnJlZSh2b2lkICpwKQp7CiAgICBpZiAocCAhPSAwKQogICAgICAgIGZyZWUoX1BUUl9UT19IRFIocCkpOwp9Cgp2b2lkICpfYXJfaW5pdCh2b2lkKQp7CiAgICBfSGVhZGVyICpzZWxmID0gbWFsbG9jKHNpemVvZiAqc2VsZik7CiAgICBhc3NlcnQoc2VsZiAhPSAwKTsKICAgIHNlbGYtPnNpemUgPSAwOwogICAgc2VsZi0+Y2FwYWNpdHkgPSAwOwogICAgcmV0dXJuIF9IRFJfVE9fUFRSKHNlbGYpOwp9Cgpjb25zdCB2b2lkICpfYXJfYXRfYyhjb25zdCB2b2lkICpwLCBwdHJkaWZmX3QgaSwgc2l6ZV90IGl0ZW1zaXplKQp7CiAgICBhc3NlcnQocCAhPSAwKTsKICAgIHB0cmRpZmZfdCBzaXplID0gX1BUUl9UT19IRFIocCktPnNpemU7CiAgICBpZiAoaSA8IDApCiAgICAgICAgaSArPSBzaXplOwogICAgYXNzZXJ0KDAgPD0gaSAmJiBpIDwgc2l6ZSk7CiAgICByZXR1cm4gKGNvbnN0IGNoYXIqKXAgKyBpKml0ZW1zaXplOwp9Cgp2b2lkICpfYXJfYXQodm9pZCAqcCwgcHRyZGlmZl90IGksIHNpemVfdCBpdGVtc2l6ZSkKewogICAgcmV0dXJuICh2b2lkKilfYXJfYXRfYyhwLCBpLCBpdGVtc2l6ZSk7Cn0KCnZvaWQgX2FyX3JlbW92ZSh2b2lkICpwLCBzaXplX3QgaSwgc2l6ZV90IG4sIHNpemVfdCBpdGVtc2l6ZSkKewogICAgYXNzZXJ0KHAgIT0gMCk7CiAgICBfSGVhZGVyICpzZWxmID0gX1BUUl9UT19IRFIocCk7CgogICAgYXNzZXJ0KHNlbGYtPnNpemUgPj0gaSk7CiAgICBhc3NlcnQoc2VsZi0+c2l6ZSA+PSBpICsgbik7CgogICAgaWYgKG4gIT0gMCkKICAgIHsKICAgICAgICBzaXplX3Qgb2xkc2l6ZSA9IHNlbGYtPnNpemU7CiAgICAgICAgc2l6ZV90IGogPSBpICsgbjsKCiAgICAgICAgaWYgKG9sZHNpemUgPiBqKQogICAgICAgICAgICBtZW1tb3ZlKF9hcl9hdChwLCBpLCBpdGVtc2l6ZSksIF9hcl9hdChwLCBqLCBpdGVtc2l6ZSksIChvbGRzaXplIC0gaikqaXRlbXNpemUpOwogICAgICAgIHNlbGYtPnNpemUgPSBvbGRzaXplIC0gbjsKICAgIH0KfQoKdm9pZCAqX2FyX2luc2VydCh2b2lkICpwLCBzaXplX3QgaSwgY29uc3Qgdm9pZCAqZmlyc3QsIHNpemVfdCBuLCBzaXplX3QgaXRlbXNpemUpCnsKICAgIGFzc2VydChwICE9IDApOwogICAgX0hlYWRlciAqc2VsZiA9IF9QVFJfVE9fSERSKHApOwoKICAgIGFzc2VydChzZWxmLT5zaXplID49IGkpOwoKICAgIGlmIChuICE9IDApCiAgICB7CiAgICAgICAgc2l6ZV90IG9sZHNpemUgPSBzZWxmLT5zaXplOwogICAgICAgIHNpemVfdCBuZXdzaXplID0gb2xkc2l6ZSArIG47CgogICAgICAgIGlmIChuZXdzaXplID4gc2VsZi0+Y2FwYWNpdHkpCiAgICAgICAgewogICAgICAgICAgICBwID0gX2FyX3Jlc2VydmUocCwgTUFYKDIqc2VsZi0+Y2FwYWNpdHksIG5ld3NpemUpLCBpdGVtc2l6ZSk7CiAgICAgICAgICAgIHNlbGYgPSBfUFRSX1RPX0hEUihwKTsKICAgICAgICB9CiAgICAgICAgc2VsZi0+c2l6ZSA9IG5ld3NpemU7CiAgICAgICAgdm9pZCAqaXAgPSBfYXJfYXQocCwgaSwgaXRlbXNpemUpOwoKICAgICAgICBpZiAob2xkc2l6ZSA+IGkpCiAgICAgICAgICAgIG1lbW1vdmUoX2FyX2F0KHAsIGkgKyBuLCBpdGVtc2l6ZSksIGlwLCAob2xkc2l6ZSAtIGkpKml0ZW1zaXplKTsKICAgICAgICBtZW1jcHkoaXAsIGZpcnN0LCBuKml0ZW1zaXplKTsKICAgIH0KICAgIHJldHVybiBwOwp9Cgp2b2lkICpfYXJfYXBwZW5kKHZvaWQgKnAsIGNvbnN0IHZvaWQgKml0ZW0sIHNpemVfdCBpdGVtc2l6ZSkKewogICAgYXNzZXJ0KHAgIT0gMCk7CiAgICByZXR1cm4gX2FyX2luc2VydChwLCBfUFRSX1RPX0hEUihwKS0+c2l6ZSwgaXRlbSwgMSwgaXRlbXNpemUpOwp9CgovLyBBcnJheSAocHVibGljKS4KCnZvaWQgYXJfcG9wKHZvaWQgKnApCnsKICAgIGFzc2VydChwICE9IDApOwogICAgX0hlYWRlciAqc2VsZiA9IF9QVFJfVE9fSERSKHApOwogICAgYXNzZXJ0KHNlbGYtPnNpemUgPiAwKTsKICAgIHNlbGYtPnNpemUtLTsKfQoKdm9pZCBhcl9jbGVhcih2b2lkICpwKQp7CiAgICBhc3NlcnQocCAhPSAwKTsKICAgIF9QVFJfVE9fSERSKHApLT5zaXplID0gMDsKfQoKc2l6ZV90IGFyX3NpemUoY29uc3Qgdm9pZCAqcCkKewogICAgYXNzZXJ0KHAgIT0gMCk7CiAgICByZXR1cm4gX1BUUl9UT19IRFIocCktPnNpemU7Cn0KCnNpemVfdCBhcl9jYXBhY2l0eShjb25zdCB2b2lkICpwKQp7CiAgICBhc3NlcnQocCAhPSAwKTsKICAgIHJldHVybiBfUFRSX1RPX0hEUihwKS0+Y2FwYWNpdHk7Cn0KCiNkZWZpbmUgYXJfaW5pdChhKSAoKGEpID0gX2FyX2luaXQoKSkKI2RlZmluZSBhcl9mcmVlKGEpIChfYXJfZnJlZShhKSwgKGEpID0gMCkKI2RlZmluZSBhcl9yZXNlcnZlKGEsIG4pICgoYSkgPSBfYXJfcmVzZXJ2ZShhLCBuLCBzaXplb2YgKihhKSkpCiNkZWZpbmUgYXJfcmVzaXplKGEsIG4pICgoYSkgPSBfYXJfcmVzaXplKGEsIG4sIHNpemVvZiAqKGEpKSkKI2RlZmluZSBhcl9hdChhLCBpKSAoKChfX3R5cGVvZl9fKCooYSkpKilfYXJfYXQoYSwgaSwgc2l6ZW9mICooYSkpKVswXSkKI2RlZmluZSBhcl9hdF9jKGEsIGkpICgoKGNvbnN0IF9fdHlwZW9mX18oKihhKSkqKV9hcl9hdF9jKGEsIGksIHNpemVvZiAqKGEpKSlbMF0pCiNkZWZpbmUgYXJfcmVtb3ZlKGEsIGksIG4pIF9hcl9yZW1vdmUoYSwgaSwgbiwgc2l6ZW9mICooYSkpCiNkZWZpbmUgYXJfaW5zZXJ0KGEsIGksIHMsIG4pICgoYSkgPSBfYXJfaW5zZXJ0KGEsIGksIHMsIG4sIHNpemVvZiAqKGEpKSkKI2RlZmluZSBhcl9hcHBlbmQoYSwgdikgKChhKSA9IF9hcl9hcHBlbmQoYSwgKF9fdHlwZW9mX18oKihhKSlbXSl7dn0sIHNpemVvZiAqKGEpKSkKCi8vIE1haW4uCgp2b2lkIGFyX3ByaW50KGNvbnN0IGludCAqcCkKewogICAgcHJpbnRmKCJzaXplO2NhcGFjaXR5OiAlenU7JXp1OiBbIiwgYXJfc2l6ZShwKSwgYXJfY2FwYWNpdHkocCkpOwogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcl9zaXplKHApOyBpKyspCiAgICB7CiAgICAgICAgaWYgKGkgIT0gMCkgcHJpbnRmKCIsICIpOwogICAgICAgIHByaW50ZigiJWQiLCBwW2ldKTsKICAgIH0KICAgIHB1dHMoIl0iKTsKfQoKaW50IG1haW4odm9pZCkKewogICAgaW50ICpwID0gMDsKICAgIC8vIEluaXQKICAgIGFyX2luaXQocCk7CiAgICBhcl9wcmludChwKTsKICAgIC8vIEFwcGVuZAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCiAgICB7CiAgICAgICAgYXJfYXBwZW5kKHAsIGkpOwogICAgICAgIGFyX3ByaW50KHApOwogICAgfQogICAgLy8gQXQKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQogICAgewogICAgICAgIGFzc2VydChwW2ldID09IGFyX2F0KHAsIGkpKTsKICAgICAgICBhc3NlcnQocFthcl9zaXplKHApLTEtaV0gPT0gYXJfYXQocCwgLTEtaSkpOwogICAgfQogICAgLy8gSW5zZXJ0L1JlbW92ZQogICAgYXJfaW5zZXJ0KHAsIDIsICgoaW50W10pezExMTEsIDIyMjJ9KSwgMik7IC8vIG1pZGRsZQogICAgYXJfcHJpbnQocCk7CiAgICBhcl9yZW1vdmUocCwgMiwgMik7CiAgICBhcl9wcmludChwKTsKICAgIGFyX2luc2VydChwLCAwLCAoKGludFtdKXstMywgLTIsIC0xfSksIDMpOyAvLyBmcm9udAogICAgYXJfcHJpbnQocCk7CiAgICBhcl9yZW1vdmUocCwgMCwgMyk7CiAgICBhcl9wcmludChwKTsKICAgIGFyX2luc2VydChwLCBhcl9zaXplKHApLCAoKGludFtdKXs1LCA2LCA3LCA4fSksIDQpOyAvLyBiYWNrCiAgICBhcl9wcmludChwKTsKICAgIGFyX3JlbW92ZShwLCBhcl9zaXplKHApLTQsIDQpOwogICAgYXJfcHJpbnQocCk7CiAgICAvLyBQb3AKICAgIHdoaWxlIChhcl9zaXplKHApICE9IDApCiAgICB7CiAgICAgICAgYXJfcG9wKHApOwogICAgICAgIGFyX3ByaW50KHApOwogICAgfQogICAgLy8gRnJlZQogICAgYXJfZnJlZShwKTsKICAgIHJldHVybiAwOwp9