#ifndef _EARRAY_H_ #define _EARRAY_H_ // Dhrtarastra said: O Sanjaya, what did my sons desirous of battle and the sons of Pandu do // after assembling at the holy land of righteousness, Kuruksetra? // ref: http://www.bhagavad-gita.org/Gita/verse-01-01.html #pragma region required headers #include #include #pragma endregion #pragma region type // Structure for array. // args: name, type. #define EARRAY_TS(N, T) \ typedef struct _##N { \ T* at; \ size_t space; \ } N #pragma endregion #pragma region function // Open with static memory. // args: array, at, space. #define EARRAY_FS_OPEN(N, T) \ inline T* N##_open(void* o, void* at, size_t space) #define EARRAY_FB_OPEN(N, T) { \ N* z = (N*)o; \ z->at = (T*)at; \ z->space = space; \ return z->at; \ } // Open with heap memory. // args: array, space. #define EARRAY_FS_OPENHEAP(N, T) \ inline T* N##_openHeap(void* o, size_t space) #define EARRAY_FB_OPENHEAP(N, T) { \ return N##_open(o, malloc(space*sizeof(T)), space); \ } // Reopen with different space (heap only). // args: array, space. #define EARRAY_FS_REOPEN(N, T) \ inline T* N##_reopen(void* o, size_t space) #define EARRAY_FB_REOPEN(N, T) { \ N* z = (N*)o; \ return N##_open(o, realloc(z->at, space*sizeof(T)), space); \ } // Close (heap only). // args: array. #define EARRAY_FS_CLOSE(N, T) \ inline T* N##_close(void* o) #define EARRAY_FB_CLOSE(N, T) { \ N* z = (N*)o; \ free(z->at); \ return NULL; \ } // Get where values are stored at. // args: array. #define EARRAY_FS_AT(N, T) \ inline T* N##_at(void* o) #define EARRAY_FB_AT(N, T) { \ N* z = (N*)o; \ return z->at; \ } // Get space. // args: array. #define EARRAY_FS_SPACE(N, T) \ inline size_t N##_space(void* o) #define EARRAY_FB_SPACE(N, T) { \ N* z = (N*)o; \ return z->space; \ } // Get size. // args: array. #define EARRAY_FS_SIZE(N, T) \ inline size_t N##_size(void* o) #define EARRAY_FB_SIZE(N, T) { \ return N##_space(o); \ } // Get begin index, forward. // args: array. #define EARRAY_FS_BEGIN(N, T) \ inline size_t N##_begin(void* o) #define EARRAY_FB_BEGIN(N, T) { \ return 0; \ } // Get end index, forward. // args: array. #define EARRAY_FS_END(N, T) \ inline size_t N##_end(void* o) #define EARRAY_FB_END(N, T) { \ return N##_size(o); \ } // Get begin index, backward. // args: array. #define EARRAY_FS_BEGINBACK(N, T) \ inline size_t N##_beginBack(void* o) #define EARRAY_FB_BEGINBACK(N, T) { \ return N##_size(o) - 1; \ } // Get end index, backward. // args: array. #define EARRAY_FS_ENDBACK(N, T) \ inline size_t N##_endBack(void* o) #define EARRAY_FB_ENDBACK(N, T) { \ return -1; \ } // Get whether next value exists. // args: array, index. #define EARRAY_FS_HASNEXT(N, T) \ inline int N##_hasNext(void* o, size_t i) #define EARRAY_FB_HASNEXT(N, T) { \ return i != N##_end(o); \ } // Get whether previous value exists. // args: array, index. #define EARRAY_FS_HASPREV(N, T) \ inline size_t N##_hasPrev(void* o, size_t i) #define EARRAY_FB_HASPREV(N, T) { \ return i != N##_endBack(o); \ } // Get index of next value. // args: array, index. #define EARRAY_FS_NEXT(N, T) \ inline size_t N##_next(void* o, size_t i) #define EARRAY_FB_NEXT(N, T) { \ return i + 1; \ } // Get index of previous value. // args: array, index. #define EARRAY_FS_PREV(N, T) \ inline size_t N##_prev(void* o, size_t i) #define EARRAY_FB_PREV(N, T) { \ return i - 1; \ } // Count number of values in range, forward. // args: array, start, end. #define EARRAY_FS_COUNT(N, T) \ inline size_t N##_count(void* o, size_t i, size_t ie) #define EARRAY_FB_COUNT(N, T) { \ size_t n = 0; \ for(; i!=ie; i=N##_next(o, i)) \ n++; \ return n; \ } // Count number of values in range, backward. // args: array, start, end. #define EARRAY_FS_COUNTBACK(N, T) \ inline size_t N##_countBack(void* o, size_t i, size_t ie) #define EARRAY_FB_COUNTBACK(N, T) { \ size_t n = 0; \ for(; i!=ie; i=N##_prev(o, i)) \ n++; \ return n; \ } // Get value at index. // args: array, index. #define EARRAY_FS_GET(N, T) \ inline T N##_get(void* o, size_t i) #define EARRAY_FB_GET(N, T) { \ return N##_at(o)[i]; \ } // Get values to destination, forward. // args: array, start, end, dest, dest-size. #define EARRAY_FS_GETMANY(N, T) \ inline size_t N##_getMany(void* o, size_t i, size_t ie, void* d, size_t ds) #define EARRAY_FB_GETMANY(N, T) { \ size_t n = 0; \ T* pd = (T*)d; \ for(; n