mirror of
https://github.com/emqx/neuron.git
synced 2026-10-18 13:41:22 +08:00
158 lines
5.0 KiB
C
158 lines
5.0 KiB
C
// 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 <stdbool.h>
|
|
#include <stddef.h>
|
|
|
|
/***** 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 */
|