// EXAMPLES : https://pastebin.com/VLCGGW7c #if defined __C_VECTOR_INCLUDED__ #endinput #endif #define __C_VECTOR_INCLUDED__ #define __C_VECTOR_VERSION__ 0x100 #include #tryinclude #define VECTOR_NULL (Vector:NO_ALLOC) #define INVALID_VECTOR_INDEX (cellmin) enum _:E_VECTOR { Alloc:E_VECTOR_DATA, E_VECTOR_SIZE } #if defined _INC_y_iterate iterfunc stock vector(&iterstate, cur, Vector:vector, array[] = cellmin, size = sizeof(array)) { #pragma unused cur if(array[0] == cellmin) { return vector_get_value(vector, iterstate++); } else { return vector_get_array(vector, iterstate++, array, size); } } #define iterstart@vector iterstate(INVALID_VECTOR_INDEX, 0) iterfunc stock array(&iterstate, cur, const array[], size, size2 = sizeof(array)) { #pragma unused cur if(iterstate < size && iterstate < size2) { return array[iterstate++]; } return INVALID_VECTOR_INDEX; } #define iterstart@array iterstate(INVALID_VECTOR_INDEX, 0) #endif static stock vector_push_back_ptr(&Vector:vector, &Alloc:ptr, size = 0) { new v[E_VECTOR]; if(vector == VECTOR_NULL) { v[E_VECTOR_DATA] = malloc(E_VECTOR, true); v[E_VECTOR_SIZE] = E_VECTOR; vector = Vector:malloc(E_VECTOR); } else { mgeta(v, E_VECTOR, Alloc:vector, 0); v[E_VECTOR_SIZE] += E_VECTOR; new Alloc:a = malloc(v[E_VECTOR_SIZE], true); memcpy(YSI_gMallocMemory[_:a], YSI_gMallocMemory[_:v[E_VECTOR_DATA]], 0, v[E_VECTOR_SIZE]*4, v[E_VECTOR_SIZE]); free(v[E_VECTOR_DATA]); v[E_VECTOR_DATA] = a; } new value_ptr[E_VECTOR]; ptr = value_ptr[E_VECTOR_DATA] = malloc(size, true); value_ptr[E_VECTOR_SIZE] = size; mseta(Alloc:vector, 0, v, E_VECTOR); mseta(v[E_VECTOR_DATA], v[E_VECTOR_SIZE] - E_VECTOR, value_ptr, E_VECTOR); } stock vector_push_back_value(&Vector:vector, value) { new Alloc:ptr; vector_push_back_ptr(vector, ptr); mset(ptr, 0, value); } stock vector_push_back_array(&Vector:vector, const array[], size = sizeof(array)) { new Alloc:ptr; vector_push_back_ptr(vector, ptr, size); mseta(ptr, 0, array, size); } stock vector_remove(&Vector:vector, index) { if(vector != VECTOR_NULL) { new v[E_VECTOR]; mgeta(v, E_VECTOR, Alloc:vector, 0); index *= E_VECTOR; if(0 <= index < v[E_VECTOR_SIZE]) { if(index == 0 && (v[E_VECTOR_SIZE] - E_VECTOR) == 0) { vector_free(vector); } else { free(Alloc:mget(v[E_VECTOR_DATA] + Alloc:index, E_VECTOR_DATA)); for(new i = index, j = index + E_VECTOR, value_ptr[E_VECTOR]; j < v[E_VECTOR_SIZE]; i += E_VECTOR) { mgeta(value_ptr, E_VECTOR, v[E_VECTOR_DATA], j); mseta(v[E_VECTOR_DATA], i, value_ptr, E_VECTOR); j += E_VECTOR; } v[E_VECTOR_SIZE] -= E_VECTOR; new Alloc:a = malloc(v[E_VECTOR_SIZE], true); memcpy(YSI_gMallocMemory[_:a], YSI_gMallocMemory[_:v[E_VECTOR_DATA]], 0, (v[E_VECTOR_SIZE])*4, v[E_VECTOR_SIZE]); free(v[E_VECTOR_DATA]); v[E_VECTOR_DATA] = a; mseta(Alloc:vector, 0, v, E_VECTOR); } return true; } } return false; } stock vector_get_value(Vector:vector, index) { if(vector != VECTOR_NULL) { new v[E_VECTOR]; mgeta(v, E_VECTOR, Alloc:vector, 0); index *= 2; if(0 <= index < v[E_VECTOR_SIZE]) { return mget(Alloc:mget(v[E_VECTOR_DATA], index), 0); } } return INVALID_VECTOR_INDEX; } stock vector_get_array(Vector:vector, index, array[], size = sizeof(array)) { if(vector != VECTOR_NULL) { new v[E_VECTOR]; mgeta(v, E_VECTOR, Alloc:vector, 0); index *= 2; if(0 <= index < v[E_VECTOR_SIZE]) { new ptr[E_VECTOR]; mgeta(ptr, E_VECTOR, v[E_VECTOR_DATA], index); new n_sz = ((size > ptr[E_VECTOR_SIZE]) ? ptr[E_VECTOR_SIZE] : size); mgeta(array, n_sz, ptr[E_VECTOR_DATA], 0); return n_sz; } } return INVALID_VECTOR_INDEX; } stock vector_set_value(Vector:vector, index, value) { if(vector != VECTOR_NULL) { new v[E_VECTOR]; mgeta(v, E_VECTOR, Alloc:vector, 0); index *= 2; if(0 <= index < v[E_VECTOR_SIZE]) { mset(Alloc:mget(v[E_VECTOR_DATA], index), 0, value); } } } stock vector_set_array(Vector:vector, index, array[], size = sizeof(array)) { if(vector != VECTOR_NULL) { new v[E_VECTOR]; mgeta(v, E_VECTOR, Alloc:vector, 0); index *= 2; if(0 <= index < v[E_VECTOR_SIZE]) { new ptr[E_VECTOR]; mgeta(ptr, E_VECTOR, v[E_VECTOR_DATA], index); if(size != ptr[E_VECTOR_SIZE]) { free(ptr[E_VECTOR_DATA]); ptr[E_VECTOR_DATA] = malloc(size, true); ptr[E_VECTOR_SIZE] = size; } mseta(ptr[E_VECTOR_DATA], 0, array, size); mseta(v[E_VECTOR_DATA], index, ptr, E_VECTOR); } } } stock bool:vector_is_storing_array(Vector:vector) { if(vector != VECTOR_NULL) { return mget(Alloc:mget(Alloc:vector, E_VECTOR_DATA), E_VECTOR_SIZE) != 0; } return false; } stock vector_free(&Vector:vector) { if(vector != VECTOR_NULL) { new v[E_VECTOR]; mgeta(v, E_VECTOR, Alloc:vector, 0); for(new i = 0; i < v[E_VECTOR_SIZE]; i += 2) { free(Alloc:mget(v[E_VECTOR_DATA], i)); } free(v[E_VECTOR_DATA]); free(Alloc:vector); vector = VECTOR_NULL; } } stock vector_get_array_size(Vector:vector, index) { if(vector != VECTOR_NULL) { new v[E_VECTOR]; mgeta(v, E_VECTOR, Alloc:vector, 0); index *= 2; if(0 <= index < v[E_VECTOR_SIZE]) { return mget(Alloc:v[E_VECTOR_DATA], E_VECTOR_SIZE); } } return 0; } stock vector_get_size(Vector:vector) { if(vector != VECTOR_NULL) { return (mget(Alloc:vector, E_VECTOR_SIZE) / E_VECTOR); } return 0; }