all repos — mgba @ 09cd56820f9445fc9d9f5cefe3a56408b4d654ab

mGBA Game Boy Advance Emulator

Util: Add a simple Vector definition
Jeffrey Pfau jeffrey@endrift.com
Wed, 04 Feb 2015 00:43:37 -0800
commit

09cd56820f9445fc9d9f5cefe3a56408b4d654ab

parent

15b3a3281fd78ccda46614b9c7543c16fb2be685

1 files changed, 70 insertions(+), 0 deletions(-)

jump to
A src/util/vector.h

@@ -0,0 +1,70 @@

+/* Copyright (c) 2013-2015 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef VECTOR_H +#define VECTOR_H + +#include "util/common.h" + +#define DECLARE_VECTOR(NAME, TYPE) \ + struct NAME { \ + TYPE* vector; \ + size_t size; \ + size_t capacity; \ + }; \ + void NAME ## Init(struct NAME* vector, size_t capacity); \ + void NAME ## Deinit(struct NAME* vector); \ + TYPE* NAME ## GetPointer(struct NAME* vector, size_t location); \ + void NAME ## Resize(struct NAME* vector, ssize_t change); \ + void NAME ## Shift(struct NAME* vector, size_t location, size_t difference); \ + void NAME ## Unshift(struct NAME* vector, size_t location, size_t difference); \ + void NAME ## EnsureCapacity(struct NAME* vector, size_t capacity); \ + size_t NAME ## Size(struct NAME* vector); \ + +#define DEFINE_VECTOR(NAME, TYPE) \ + void NAME ## Init(struct NAME* vector, size_t capacity) { \ + vector->size = 0; \ + if (capacity == 0) { \ + capacity = 4; \ + } \ + vector->capacity = capacity; \ + vector->vector = malloc(sizeof(TYPE) * capacity); \ + } \ + void NAME ## Deinit(struct NAME* vector) { \ + free(vector->vector); \ + vector->vector = 0; \ + vector->capacity = 0; \ + } \ + TYPE* NAME ## GetPointer(struct NAME* vector, size_t location) { \ + return &vector->vector[location]; \ + } \ + void NAME ## Resize(struct NAME* vector, ssize_t change) { \ + if (change > 0) { \ + NAME ## EnsureCapacity(vector, vector->size + change); \ + } \ + vector->size += change; \ + } \ + void NAME ## EnsureCapacity(struct NAME* vector, size_t capacity) { \ + if (capacity <= vector->capacity) { \ + return; \ + } \ + while (capacity > vector->capacity) { \ + vector->capacity <<= 1; \ + } \ + vector->vector = realloc(vector->vector, vector->capacity * sizeof(TYPE)); \ + } \ + void NAME ## Shift(struct NAME* vector, size_t location, size_t difference) { \ + memmove(&vector->vector[location], &vector->vector[location + difference], (vector->size - location - difference) * sizeof(TYPE)); \ + vector->size -= difference; \ + } \ + void NAME ## Unshift(struct NAME* vector, size_t location, size_t difference) { \ + NAME ## Resize(vector, difference); \ + memmove(&vector->vector[location + difference], &vector->vector[location], (vector->size - location - difference) * sizeof(TYPE)); \ + } \ + size_t NAME ## Size(struct NAME* vector) { \ + return vector->size; \ + } \ + +#endif