131 lines
5.5 KiB
C
131 lines
5.5 KiB
C
/*
|
|
* C_lib Copyright (C) 2021 Wael Karram.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, version 3 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/* This header defines a double-linked-list and related functions. */
|
|
/* Use the double nodes. */
|
|
#include <stdlib.h> /* Used in allocations and deallocations. */
|
|
#include <math.h>
|
|
#include <string.h>
|
|
/* Include assert.h to allow code generation, but only run with debug flag. */
|
|
#ifdef DEBUG
|
|
#ifndef NDEBUG
|
|
#define NDEBUG
|
|
#endif /* NDEBUG. */
|
|
#endif /* DEBUG. */
|
|
#include <assert.h>
|
|
/* Include the void swapping. */
|
|
#include "../utils/swap_void.c"
|
|
|
|
|
|
|
|
#ifndef VECTOR_H
|
|
#define VECTOR_H
|
|
/* Constants. */
|
|
/* Growth constant, for the power. */
|
|
#define GROWTH_CONSTANT_VECTOR_C 2
|
|
/* Inital power. */
|
|
#define INITIAL_POWER_VECTOR_C 3
|
|
/* Function errror/return code on success. */
|
|
#define SUCCESS_CODE_VECTOR_C 1
|
|
/* Function errror/return code on failure. */
|
|
#define FAILURE_CODE_VECTOR_C 0
|
|
/* Function errror/return code on failure to find index. */
|
|
#define INDEX_NOT_FOUND_CODE_VECTOR_C -1
|
|
/* Function errror/return code on invalid input. */
|
|
#define INVALID_INPUT_CODE_VECTOR_C -2
|
|
/* Function errror/return code on invalid input. */
|
|
#define INVALID_FREE_FUNCTION_POINTER -3
|
|
/* Error code returned when input fails sanity check. */
|
|
#define CODE_FREE_SUCCESS_MALFORMED_VECTOR_C -1
|
|
/* Check code for growing the vector. */
|
|
#define CODE_GROW_VECTOR_C 1
|
|
/* Check code for keeping the vector as is. */
|
|
#define CODE_KEEP_VECTOR_C 0
|
|
/* Check code for shrinking the vector. */
|
|
#define CODE_SHRINK_VECTOR_C -1
|
|
/* Error code for when write succeeds and vector grow fails. */
|
|
#define WRITE_SUCCESS_VECTOR_GROW_FAIL_VECTOR_C 3
|
|
/* Error code for when delete succeeds and vector shrink fails. */
|
|
#define DELETE_SUCCESS_VECTOR_SHRINK_FAIL_VECTOR_C 4
|
|
/* Error code to indicate allocation failure. */
|
|
#define ALLOC_FAILURE_VECTOR_C 5
|
|
/* Used to calculate the whole when checking size-changes. */
|
|
#define THRESHOLD_WHOLE_VECTOR_C 1.0
|
|
/* The threshold used to grow the vector. */
|
|
#define THRESHOLD_GROW_VECTOR_C 0.75
|
|
/* The threshold used to shrink the vector. */
|
|
#define THRESHOLD_SHRINK_VECTOR_C 0.25
|
|
/* Define the initial index for the last element. */
|
|
#define LAST_ELEMENT_EMPTY_INDEX_VECTOR_C 0
|
|
/* Boolean Logic. */
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
|
|
|
|
/* Useful typedef for void pointers to make it simpler to deal with. */
|
|
typedef void* void_ptr;
|
|
|
|
/* The vector's struct. */
|
|
typedef struct vector {
|
|
/* Stores the current power used to compute the length. */
|
|
int power;
|
|
/* Stores the vector's length. */
|
|
size_t length;
|
|
/* Stores the size of a single element. */
|
|
size_t element_size;
|
|
/* Stores the index of the last used element (inclusive!). */
|
|
size_t last_element;
|
|
/* Stores whethere or not the vector is empty. */
|
|
char empty;
|
|
/* Stores a pointer to the array. */
|
|
void_ptr *array;
|
|
} vector_t;
|
|
|
|
/* Function declarations. */
|
|
/* This function initializes a new empty vector. */
|
|
static inline vector_t* initialize_vector();
|
|
/* This function appends to the vector. */
|
|
static inline int append_to_vector(vector_t* vector, void* const data);
|
|
/* This function prepends to the vector. */
|
|
static inline int prepend_to_vector(vector_t* const vector, void* const data);
|
|
/* This function reads from the vector at the given index. */
|
|
static inline void* read_from_vector(const vector_t* const vector, const size_t index);
|
|
/* This function overwrites the value at the given index. */
|
|
static inline int write_to_vector(vector_t* const vector, const size_t index, void* const data);
|
|
/* This function frees the data at the given index (using the given free function, if NULL doesn't change it!) and marks the cell there as NULL. */
|
|
static inline void delete_from_vector(vector_t* const vector, const size_t index, void (*free_function)(const void*));
|
|
/* This function serializes the vector into an array! */
|
|
static inline void_ptr* serialize_vector(const vector_t* const vector);
|
|
/* This function copies a vector. */
|
|
static inline int copy_vector(vector_t *restrict source, vector_t **restrict destination);
|
|
/* This function frees a vector. */
|
|
static inline void free_vector(vector_t *vector, void (*free_function)(const void*));
|
|
/* Internal functions. */
|
|
/* This function checks if a vector needs to be grown. */
|
|
static inline int check_vector_grow(const vector_t* const vector, const double threshold);
|
|
/* This function checks if a vector needs to be shrunk. */
|
|
static inline int check_vector_shrink(const vector_t* const vector, const double threshold);
|
|
/* This function grows the vector, doesn't change the vector on failure. */
|
|
static inline int grow_vector(vector_t* const vector);
|
|
/* This function shrinks the vector, doesn't change the vector on failure. */
|
|
static inline int shrink_vector(vector_t* const vector);
|
|
/* This function compacts a vector by pushing all the NULLs to the end. */
|
|
static inline void compact_vector(vector_t* const vector);
|
|
/* This function creates a "gap" at the start of the vector. */
|
|
static inline void push_vector(const vector_t* const vector, const size_t gap_length);
|
|
|
|
#endif /* VECTOR_H */
|