// The MIT License (MIT) // Copyright (c) 2016 Peter Goldsborough // // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef VECTOR_H #define VECTOR_H #include #include /***** DEFINITIONS *****/ #define VECTOR_MINIMUM_CAPACITY 2 #define VECTOR_GROWTH_FACTOR 2 #define VECTOR_SHRINK_THRESHOLD (1 / 4) #define VECTOR_ERROR -1 #define VECTOR_SUCCESS 0 #define VECTOR_UNINITIALIZED NULL #define VECTOR_INITIALIZER \ { 0, 0, 0, VECTOR_UNINITIALIZED } /***** STRUCTURES *****/ typedef struct Vector { size_t size; size_t capacity; size_t element_size; void* data; } Vector; typedef struct Iterator { void* pointer; size_t element_size; } Iterator; /***** METHODS *****/ /* Constructor */ int vector_setup(Vector* vector, size_t capacity, size_t element_size); /* Copy Constructor */ int vector_copy(Vector* destination, Vector* source); /* Copy Assignment */ int vector_copy_assign(Vector* destination, Vector* source); /* Move Constructor */ int vector_move(Vector* destination, Vector* source); /* Move Assignment */ int vector_move_assign(Vector* destination, Vector* source); int vector_swap(Vector* destination, Vector* source); /* Destructor */ int vector_destroy(Vector* vector); /* Insertion */ int vector_push_back(Vector* vector, void* element); int vector_push_front(Vector* vector, void* element); int vector_insert(Vector* vector, size_t index, void* element); int vector_assign(Vector* vector, size_t index, void* element); /* Deletion */ int vector_pop_back(Vector* vector); int vector_pop_front(Vector* vector); int vector_erase(Vector* vector, size_t index); int vector_clear(Vector* vector); /* Lookup */ void* vector_get(Vector* vector, size_t index); const void* vector_const_get(const Vector* vector, size_t index); void* vector_front(Vector* vector); void* vector_back(Vector* vector); #define VECTOR_GET_AS(type, vector_pointer, index) \ *((type*)vector_get((vector_pointer), (index))) /* Information */ bool vector_is_initialized(const Vector* vector); size_t vector_byte_size(const Vector* vector); size_t vector_free_space(const Vector* vector); bool vector_is_empty(const Vector* vector); /* Memory management */ int vector_resize(Vector* vector, size_t new_size); int vector_reserve(Vector* vector, size_t minimum_capacity); int vector_shrink_to_fit(Vector* vector); /* Iterators */ Iterator vector_begin(Vector* vector); Iterator vector_end(Vector* vector); Iterator vector_iterator(Vector* vector, size_t index); void* iterator_get(Iterator* iterator); #define ITERATOR_GET_AS(type, iterator) *((type*)iterator_get((iterator))) int iterator_erase(Vector* vector, Iterator* iterator); void iterator_increment(Iterator* iterator); void iterator_decrement(Iterator* iterator); void* iterator_next(Iterator* iterator); void* iterator_previous(Iterator* iterator); bool iterator_equals(Iterator* first, Iterator* second); bool iterator_is_before(Iterator* first, Iterator* second); bool iterator_is_after(Iterator* first, Iterator* second); size_t iterator_index(Vector* vector, Iterator* iterator); #define VECTOR_FOR_EACH(vector_pointer, iterator_name) \ for (Iterator(iterator_name) = vector_begin((vector_pointer)), \ end = vector_end((vector_pointer)); \ !iterator_equals(&(iterator_name), &end); \ iterator_increment(&(iterator_name))) /***** PRIVATE *****/ #define MAX(a, b) ((a) > (b) ? (a) : (b)) bool _vector_should_grow(Vector* vector); bool _vector_should_shrink(Vector* vector); size_t _vector_free_bytes(const Vector* vector); void* _vector_offset(Vector* vector, size_t index); const void* _vector_const_offset(const Vector* vector, size_t index); void _vector_assign(Vector* vector, size_t index, void* element); int _vector_move_right(Vector* vector, size_t index); void _vector_move_left(Vector* vector, size_t index); int _vector_adjust_capacity(Vector* vector); int _vector_reallocate(Vector* vector, size_t new_capacity); void _vector_swap(size_t* first, size_t* second); #endif /* VECTOR_H */