123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- #include <stdlib.h>
- #include "tbegin.h"
- #ifdef TEMPLATE_OK
- #ifndef TEMPLATE_IMPLEMENT
- struct TEMPLATE_STRUCT;
- typedef struct TEMPLATE_STRUCT TEMPLATE_NAME;
- #define TEMPLATE_COMPARATOR TJOIN(TEMPLATE_STRUCT, Compare)
- typedef int TEMPLATE_COMPARATOR (const void * self, const void * other);
-
- int TEMPLATE_FUNC(size)(TEMPLATE_NAME * self);
- TEMPLATE_NAME * TEMPLATE_FUNC(done)(TEMPLATE_NAME * self);
- TEMPLATE_NAME * TEMPLATE_FUNC(free)(TEMPLATE_NAME * self);
- TEMPLATE_NAME * TEMPLATE_FUNC(alloc)();
- TEMPLATE_NAME * TEMPLATE_FUNC(init)(TEMPLATE_NAME * self, int size);
- TEMPLATE_NAME * TEMPLATE_FUNC(size_)(TEMPLATE_NAME * self, int newsize);
- TEMPLATE_NAME * TEMPLATE_FUNC(new)(int size);
- TEMPLATE_NAME * TEMPLATE_FUNC(grow)(TEMPLATE_NAME * self, int amount);
- TEMPLATE_T * TEMPLATE_FUNC(getptr_unsafe)(TEMPLATE_NAME * self, int index);
- TEMPLATE_T TEMPLATE_FUNC(getraw_unsafe)(TEMPLATE_NAME * self, int index);
- TEMPLATE_NAME * TEMPLATE_FUNC(putraw_unsafe)
- (TEMPLATE_NAME * self, int index, TEMPLATE_T value);
- TEMPLATE_T TEMPLATE_FUNC(getraw)(TEMPLATE_NAME * self,
- size_t index, TEMPLATE_T zero);
- int TEMPLATE_FUNC(get)(TEMPLATE_NAME * self,
- int index, TEMPLATE_T * get);
- TEMPLATE_T * TEMPLATE_FUNC(getptr)(TEMPLATE_NAME * self, int index);
- TEMPLATE_NAME * TEMPLATE_FUNC(put)(TEMPLATE_NAME * self,
- int index, TEMPLATE_T value);
- TEMPLATE_NAME * TEMPLATE_FUNC(putptr)(TEMPLATE_NAME * self, int index,
- TEMPLATE_T * ptr);
- #else
- struct TEMPLATE_STRUCT {
- TEMPLATE_T * data;
- int size;
- };
- int TEMPLATE_FUNC(size)(TEMPLATE_NAME * self) {
- if(!self) return 0;
- return self->size;
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(done)(TEMPLATE_NAME * self) {
- if(!self) return NULL;
- TEMPLATE_FREE(self->data);
- self->data = NULL;
- self->size = 0;
- return self;
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(free)(TEMPLATE_NAME * self) {
- TEMPLATE_FUNC(done)(self);
- TEMPLATE_FREE(self);
- return NULL;
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(alloc)() {
- return TEMPLATE_ALLOC(sizeof(TEMPLATE_NAME));
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(init)(TEMPLATE_NAME * self, int size) {
- if(!self) return NULL;
- if(size < 0) return NULL;
- self->size = size;
- self->data = TEMPLATE_ALLOC(sizeof(TEMPLATE_T) * size);
- return self;
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(size_)(TEMPLATE_NAME * self, int newsize) {
- TEMPLATE_T * newd = NULL;
- if(!self) return NULL;
- int index, stop;
-
-
- if(newsize < 1) return NULL;
- newd = TEMPLATE_ALLOC(newsize * sizeof(TEMPLATE_T));
- if(!newd) return NULL;
-
- if(self->data) {
- stop = self->size < newsize ? self->size : newsize;
- for(index = 0; index < self->size; index ++) {
- newd[index] = self->data[index];
- }
- }
-
-
- self->data = newd;
- self->size = newsize;
- return self;
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(new)(int size) {
- TEMPLATE_NAME * res = TEMPLATE_FUNC(alloc)();
- if(!TEMPLATE_FUNC(init)(res, size)) {
- return TEMPLATE_FUNC(free)(res);
- }
- return res;
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(grow)(TEMPLATE_NAME * self, int amount) {
- int mysize = TEMPLATE_FUNC(size)(self);
- if (mysize >= amount) return NULL;
- return TEMPLATE_FUNC(size_)(self, amount);
- }
- int TEMPLATE_FUNC(outofrange)(TEMPLATE_NAME * self, int index) {
- if(!self) return TRUE;
- if (index < 0) return TRUE;
- return index >= TEMPLATE_FUNC(size)(self);
- }
- TEMPLATE_T * TEMPLATE_FUNC(getptr_unsafe)(TEMPLATE_NAME * self, int index) {
- return self->data + index;
- }
- TEMPLATE_T TEMPLATE_FUNC(getraw_unsafe)(TEMPLATE_NAME * self, int index) {
- return self->data[index];
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(putraw_unsafe)
- (TEMPLATE_NAME * self, int index, TEMPLATE_T value) {
- self->data[index] = value;
- return self;
- }
- TEMPLATE_T TEMPLATE_FUNC(getraw)(TEMPLATE_NAME * self,
- size_t index, TEMPLATE_T zero) {
-
- if(TEMPLATE_FUNC(outofrange)(self, index)) { return zero; }
- return TEMPLATE_FUNC(getraw_unsafe)(self, index);
- }
- int TEMPLATE_FUNC(get)(TEMPLATE_NAME * self,
- int index, TEMPLATE_T * get) {
-
- if(!get) { return FALSE; }
- if(TEMPLATE_FUNC(outofrange)(self, index)) { return FALSE; }
- (*get) = TEMPLATE_FUNC(getraw_unsafe)(self, index);
- return TRUE;
- }
- TEMPLATE_T * TEMPLATE_FUNC(getptr)(TEMPLATE_NAME * self, int index) {
-
- if(TEMPLATE_FUNC(outofrange)(self, index)) { return NULL; }
- return TEMPLATE_FUNC(getptr_unsafe)(self, index);
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(put)(TEMPLATE_NAME * self,
- int index, TEMPLATE_T value) {
-
- if(TEMPLATE_FUNC(outofrange)(self, index)) { return NULL; }
- return TEMPLATE_FUNC(putraw_unsafe)(self, index, value);
- }
- TEMPLATE_NAME * TEMPLATE_FUNC(putptr)(TEMPLATE_NAME * self, int index,
- TEMPLATE_T * ptr) {
- if(!ptr) return NULL;
- return TEMPLATE_FUNC(put)(self, index, (*ptr));
-
-
- }
- #ifdef TEMPLATE_COMPARATOR
- TEMPLATE_NAME * TEMPLATE_FUNC(qsort)(TEMPLATE_NAME * self,
- TEMPLATE_COMPARATOR * compare) {
- void * base; int nmemb; size_t size;
- if(!self) return NULL;
- base = self->data;
- nmemb = self->size;
- size = sizeof(TEMPLATE_T);
- qsort(base, nmemb, size, compare);
- return self;
- }
- #endif
- #endif
- #endif
- #ifdef TEMPLATE_ZERO
- #undef TEMPLATE_ZERO
- #endif
- #ifdef TEMPLATE_COMPARATOR
- #undef TEMPLATE_COMPARATOR
- #endif
- #include <tend.h>
- #ifdef TEMPLATE_IMPLEMENT
- #undef TEMPLATE_IMPLEMENT
- #endif
|