\ AT##_Append(AT **arrp, ElemType *elem) \ { \ assert(arrp); \ if (!*arrp) { \ AT##_Resize(arrp, 1); \ } else if ((*arrp)->size == (*arrp)->capacity) { \ AT##_Resize(arrp, (*arrp)->capacity + ((*arrp)->capacity + 1)/2); \ } \ (*arrp)->buf[(*arrp)->size++] = elem; \ } \ \ __TK_ARRAY_UNUSED \ static size_t \ AT##_PopBack(AT *arr) \ { \ assert(!AT##_IsEmpty(arr)); \ return arr->size -= 1; \ } \ \ __TK_ARRAY_UNUSED \ static ElemType * \ AT##_Get(const AT *arr, size_t at) \ { \ assert(arr); \ assert(at < AT##_Size(arr)); \ return arr->buf[at]; \ } \ \ __TK_ARRAY_UNUSED \ static void \ AT##_Set(AT *arr, size_t at, ElemType *elem) \ { \ assert(arr); \ assert(at < AT##_Size(arr)); \ arr->buf[at] = elem; \ } \ \ __TK_ARRAY_UNUSED \ static void \ AT##_Free(AT **arrp) \ { \ AT##_Resize(arrp, 0); \ } \ \ __TK_ARRAY_UNUSED \ static int \ AT##_Find(const AT *arr, const ElemType *elem) \ { \ assert(!arr || arr->size != 0xdeadbeef); \ if (arr) { \ ElemType *const *buf = arr->buf; \ size_t i; \ for (i = 0; i < arr->size; ++i) { \ if (buf[i] == elem) { \ return (int) i; \ } \ } \ } \ return -1; \ } \ \ __TK_ARRAY_UNUSED \ static int \ AT##_Contains(const AT *arr, const ElemType *elem) \ { \ return AT##_Find(arr, elem) != -1; \ } \ /* ------------------------------------------------------------------------- */