Archeus 0.0.0
A C library and game engine that focuses on documentation
Loading...
Searching...
No Matches
vector.c File Reference
#include "arc/std/vector.h"
#include "arc/std/bool.h"
#include "arc/std/errno.h"
#include <stdint.h>
#include <stdlib.h>

Go to the source code of this file.

Data Structures

struct  ARC_Vector
 

Functions

ARC_Bool ARC_Vector_CompareDataDefaultFn (void *dataA, void *dataB)
 
void ARC_Vector_Create (ARC_Vector **vector, ARC_Vector_CompareDataFn *compareDataFn, ARC_Vector_DestroyDataFn *destroyDataFn)
 creates an ARC_Vector which is an "expandable" array
 
void ARC_Vector_Destroy (ARC_Vector *vector)
 destroys an ARC_Vector
 
void ARC_Vector_Add (ARC_Vector *vector, void *data)
 adds an item to an ARC_Vector
 
void ARC_Vector_Remove (ARC_Vector *vector, void *data)
 removes an item from a matching item in an ARC_Vector
 
void ARC_Vector_RemoveIndex (ARC_Vector *vector, uint32_t index)
 removes an item from an ARC_Vector at an index
 
void ARC_Vector_Clear (ARC_Vector *vector)
 clears all items from a vector
 
uint32_t ARC_Vector_GetSize (ARC_Vector *vector)
 gets the current size of an ARC_Vector as an unsigned 32 bit integer
 
void * ARC_Vector_Get (ARC_Vector *vector, uint32_t index)
 gets an item from an ARC_Vector at a position index
 

Function Documentation

◆ ARC_Vector_Add()

void ARC_Vector_Add ( ARC_Vector * vector,
void * data )

adds an item to an ARC_Vector

Note
this will error if you add more than 4,294,967,295 items (the max value of an unsigned int 32)
Parameters
[in]vectorARC_Vector to add to
[in]datadata that is being added

Definition at line 67 of file vector.c.

67 {
68 //check to see if the current size is the same as a max uint32_t and if so it will overflow so throw an error
69 if(vector->currentSize == ~((uint32_t)0)){
71 ARC_DEBUG_LOG_ERROR("ARC_Vector_Add(vector, data), vector at max capacity tried adding another value");
72 return;
73 }
74
75 //check if we are at the max of the current capacity
76 if(vector->currentSize == vector->currentCapacity){
77 //increase the current capacity by double
78 vector->currentCapacity <<= 1;
79
80 //if for some reason the capacity is 0, we should set it to one so we do not error on realloc
81 if(vector->currentCapacity != 0){
82 vector->currentCapacity++;
83 }
84
85 //resize the vectors array and copy the contents at the same time
86 vector->data = (void **)realloc(vector->data, sizeof(void *) * vector->currentCapacity);
87 }
88
89 //add to the vectors array and increase its current size
90 vector->data[vector->currentSize] = data;
91 vector->currentSize++;
92}
int32_t arc_errno
Definition errno.c:5
#define ARC_ERRNO_OVERFLOW
Definition errno.h:10
#define ARC_DEBUG_LOG_ERROR(STR)
Definition errno.h:39
void ** data
Definition vector.c:13
uint32_t currentCapacity
Definition vector.c:10
uint32_t currentSize
Definition vector.c:11

References ARC_DEBUG_LOG_ERROR, arc_errno, ARC_ERRNO_OVERFLOW, ARC_Vector::currentCapacity, ARC_Vector::currentSize, and ARC_Vector::data.

Referenced by ARC_Handler_Add(), ARC_Handler_Remove(), ARC_Handler_RemoveIndex(), ARC_Lexer_LexString(), ARC_Lexer_RegisterTokenRule(), ARC_Parser_ParseTag(), ARC_ParserCSVData_CreateFn(), ARC_ParserCSVData_GetDataTag(), ARC_ParserCSVData_RunLineTag(), ARC_ParserLangParsedData_CreateBodyTag(), ARC_ParserLangParsedData_GetArgumentsTag(), ARC_ParserLangParsedData_GetArgumentTag(), and ARC_ParserLangParsedData_RunLineTag().

◆ ARC_Vector_Clear()

void ARC_Vector_Clear ( ARC_Vector * vector)

clears all items from a vector

Note
this function will call ARC_Vector_RemoveIndex, so it's notes are also applicable to this function
Parameters
[in]vectorARC_Vector to clear

Definition at line 139 of file vector.c.

139 {
140 //remove each item in the vector untill the vector is empty
141 while(ARC_Vector_GetSize(vector) != 0){
142 ARC_Vector_RemoveIndex(vector, 0);
143 }
144}
uint32_t ARC_Vector_GetSize(ARC_Vector *vector)
gets the current size of an ARC_Vector as an unsigned 32 bit integer
Definition vector.c:146
void ARC_Vector_RemoveIndex(ARC_Vector *vector, uint32_t index)
removes an item from an ARC_Vector at an index
Definition vector.c:107

References ARC_Vector_GetSize(), and ARC_Vector_RemoveIndex().

Referenced by ARC_Lexer_Clear(), ARC_Parser_ParseTag(), and ARC_Vector_Destroy().

◆ ARC_Vector_CompareDataDefaultFn()

ARC_Bool ARC_Vector_CompareDataDefaultFn ( void * dataA,
void * dataB )

Definition at line 20 of file vector.c.

20 {
21 if(dataA == dataB){
22 return ARC_True;
23 }
24
25 return ARC_False;
26}
#define ARC_False
Definition bool.h:12
#define ARC_True
Definition bool.h:11

References ARC_False, and ARC_True.

Referenced by ARC_Vector_Create().

◆ ARC_Vector_Create()

void ARC_Vector_Create ( ARC_Vector ** vector,
ARC_Vector_CompareDataFn * compareDataFn,
ARC_Vector_DestroyDataFn * destroyDataFn )

creates an ARC_Vector which is an "expandable" array

Note
for this basic implementation, the array will double in size every time the capacity is hit
the array will also half in size when the array is only half filled
Parameters
[out]vectorARC_Vector to initialize
[in]compareDataFna callback that checks if data stored in the array matches, if set to NULL and ARC_Vector_Remove is called, the pointer addresses will be compared
[in]destroyDataFna callback that frees an item on remove or clear, can be set to NULL to do nothing

Definition at line 28 of file vector.c.

28 {
29 //create the vector
30 *vector = (ARC_Vector *)malloc(sizeof(ARC_Vector));
31
32 //initialize all the values stored in the vector
33 (*vector)->data = (void **)malloc(sizeof(void *));
34 (*vector)->currentCapacity = 1;
35 (*vector)->currentSize = 0;
36
37 //set a default for compareDataFn, then override it if it is passed in through parameters
38 (*vector)->compareDataFn = ARC_Vector_CompareDataDefaultFn;
39 if(compareDataFn != NULL){
40 (*vector)->compareDataFn = *compareDataFn;
41 }
42
43 //set NULL as a default for deleteDataFn, then copy the delete data function callback if it exists
44 (*vector)->destroyDataFn = NULL;
45 if(destroyDataFn != NULL){
46 (*vector)->destroyDataFn = (ARC_Vector_DestroyDataFn *)malloc(sizeof(ARC_Vector_DestroyDataFn));
47 *((*vector)->destroyDataFn) = *destroyDataFn;
48 }
49}
ARC_Bool ARC_Vector_CompareDataDefaultFn(void *dataA, void *dataB)
Definition vector.c:20
void(* ARC_Vector_DestroyDataFn)(void *data)
a callback that cleans up memory when it is removed from the vector
Definition vector.h:31

References ARC_Vector_CompareDataDefaultFn(), and ARC_Vector::data.

Referenced by ARC_Handler_Create(), ARC_Lexer_Create(), ARC_Parser_ParseTag(), ARC_ParserCSVData_CreateFn(), ARC_ParserCSVData_RunLineTag(), ARC_ParserLang_CreateDataFn(), ARC_ParserLangParsedData_CreateBodyTag(), and ARC_ParserLangParsedData_GetArgumentsTag().

◆ ARC_Vector_Destroy()

void ARC_Vector_Destroy ( ARC_Vector * vector)

destroys an ARC_Vector

Note
this will not free the items stored in the vector
please make sure to clear and free the children before destroying an ARC_Vector
Parameters
[in]vectorARC_Vector to free

Definition at line 51 of file vector.c.

51 {
52 //remove all the contents before destroying the vector
53 ARC_Vector_Clear(vector);
54
55 //free the delete data function if it exists
56 if(vector->destroyDataFn){
57 free(vector->destroyDataFn);
58 }
59
60 //free everything stored in the vector
61 free(vector->data);
62
63 //free the vector
64 free(vector);
65}
ARC_Vector_DestroyDataFn * destroyDataFn
Definition vector.c:16
void ARC_Vector_Clear(ARC_Vector *vector)
clears all items from a vector
Definition vector.c:139

References ARC_Vector_Clear(), ARC_Vector::data, and ARC_Vector::destroyDataFn.

Referenced by ARC_Handler_Destroy(), ARC_Lexer_Destroy(), ARC_Parser_ParseTag(), ARC_ParserCSVData_CreateFn(), ARC_ParserCSVData_VectorDestroyVectorFn(), ARC_ParserLang_DestroyDataFn(), ARC_ParserLang_VectorDestroyVectorFn(), ARC_ParserLangParsedData_CreateBodyTag(), and ARC_ParserTagToken_Destroy().

◆ ARC_Vector_Get()

void * ARC_Vector_Get ( ARC_Vector * vector,
uint32_t index )

gets an item from an ARC_Vector at a position index

Note
this function will error if trying to get an index that is outside the bounds of the ARC_Vector
Parameters
[in]vectorARC_Vector to get data from
[in]indexposition of data to get
Returns
a void * item, or NULL on error

Definition at line 150 of file vector.c.

150 {
151 //check to make sure the given index is in bounds of the vector
152 if(index >= vector->currentSize){
154 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Vector_Get(vector, %u), null value as the index was out of bounds", index);
155 return NULL;
156 }
157
158 return vector->data[index];
159}
#define ARC_DEBUG_LOG_ERROR_WITH_VARIABLES(STR,...)
Definition errno.h:40
#define ARC_ERRNO_DATA
Definition errno.h:7

References ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_DATA, ARC_Vector::currentSize, and ARC_Vector::data.

Referenced by ARC_Handler_Clean(), ARC_Handler_Iterate(), ARC_Handler_RemoveIndex(), ARC_Lexer_GetToken(), ARC_Lexer_IsTokenId(), ARC_Lexer_LexString(), ARC_Lexer_PrintTokenRules(), ARC_Lexer_RegisterTokenRule(), ARC_Parser_CreateFromVector(), ARC_ParserCSVData_CreateFn(), ARC_ParserCSVData_GetDataTag(), ARC_ParserCSVData_RunLineTag(), ARC_ParserData_HelperRecurseStringAdd(), ARC_ParserLangParsedData_CreateBodyTag(), ARC_ParserLangParsedData_CreateTagString(), ARC_ParserLangParsedData_GetArgumentsTag(), ARC_ParserLangParsedData_GetArgumentTag(), ARC_ParserLangParsedData_RecurseStringAdd(), and ARC_ParserLangParsedData_RunLineTag().

◆ ARC_Vector_GetSize()

◆ ARC_Vector_Remove()

void ARC_Vector_Remove ( ARC_Vector * vector,
void * data )

removes an item from a matching item in an ARC_Vector

Note
this function uses the ARC_Vector_CompareDataFn that the ARC_Vector was created with
this function will not throw an error if there is no match
this function will call ARC_Vector_RemoveIndex, so it's notes are also applicable to this function
Parameters
[in]vectorARC_Vector to remove from
[in]datamatching data to remove

Definition at line 94 of file vector.c.

94 {
95 //iterate through every item to check to see if it exists
96 for(uint32_t index = 0; index < vector->currentSize; index++){
97 //keep the code cleaner by pulling the current index data into a temp variable
98 void *dataB = vector->data[index];
99
100 //check if the data matches, and if so remove by index
101 if(vector->compareDataFn(data, dataB) == ARC_True){
102 ARC_Vector_RemoveIndex(vector, index);
103 }
104 }
105}
ARC_Vector_CompareDataFn compareDataFn
Definition vector.c:15

References ARC_True, ARC_Vector_RemoveIndex(), ARC_Vector::compareDataFn, ARC_Vector::currentSize, and ARC_Vector::data.

Referenced by ARC_Handler_Remove().

◆ ARC_Vector_RemoveIndex()

void ARC_Vector_RemoveIndex ( ARC_Vector * vector,
uint32_t index )

removes an item from an ARC_Vector at an index

Note
this function will error if trying to remove an index that is outside the bounds of the ARC_Vector
this function will use ARC_Vector_DeleteDataFn if it was set in the ARC_Vector_Create function
Parameters
[in]vectorARC_Vector to remove from
[in]indexposition of data to remove

Definition at line 107 of file vector.c.

107 {
108 //check to make sure the given index is in bounds of the vector
109 if(index >= vector->currentSize){
111 ARC_DEBUG_LOG_ERROR("ARC_Vector_Add(vector, data), vector at max capacity tried adding another value");
112 return;
113 }
114
115 //call delete data to clean up item if delete data function exists
116 if(vector->destroyDataFn != NULL){
117 (*(vector->destroyDataFn))(vector->data[index]);
118 }
119
120 //we will be using index to iterate as we will not use it again, so we can skip the first part of the for loop
121 for(; index + 1 < vector->currentSize; index++){
122 //override the data from index to the end by shifting it back one
123 vector->data[index] = vector->data[index + 1];
124 }
125
126 //we have removed the item so we can decrease the current size
127 vector->currentSize--;
128
129 //if the current size is half the current capacity or the current capacity is at the smallest limit, we do not need to do anything else
130 if(vector->currentSize != vector->currentCapacity >> 1 || vector->currentCapacity == 1){
131 return;
132 }
133
134 //half the capacity and copy it into a smaller array
135 vector->currentCapacity >>= 1;
136 vector->data = (void **)realloc(vector->data, sizeof(void *) * vector->currentCapacity);
137}

References ARC_DEBUG_LOG_ERROR, arc_errno, ARC_ERRNO_DATA, ARC_Vector::currentCapacity, ARC_Vector::currentSize, ARC_Vector::data, and ARC_Vector::destroyDataFn.

Referenced by ARC_Handler_Clean(), ARC_Handler_RemoveIndex(), ARC_Vector_Clear(), and ARC_Vector_Remove().