2025-08-10 01:34:16 +02:00

90 lines
2.3 KiB
C

#ifndef STRCPYVEC_H_
#define STRCPYVEC_H_
#include <common/toolkit/list/StrCpyList.h>
/**
* Note: Derived from the corresponding list. Use the list iterator for read-only access
*/
struct StrCpyVec;
typedef struct StrCpyVec StrCpyVec;
static inline void StrCpyVec_init(StrCpyVec* this);
static inline void StrCpyVec_uninit(StrCpyVec* this);
static inline void StrCpyVec_append(StrCpyVec* this, const char* valuePointer);
static inline size_t StrCpyVec_length(StrCpyVec* this);
static inline void StrCpyVec_clear(StrCpyVec* this);
// getters & setters
static inline char* StrCpyVec_at(StrCpyVec* this, size_t index);
struct StrCpyVec
{
StrCpyList strCpyList;
char** vecArray;
size_t vecArrayLen;
};
void StrCpyVec_init(StrCpyVec* this)
{
StrCpyList_init( (StrCpyList*)this);
this->vecArrayLen = 4;
this->vecArray = (char**)os_kmalloc(
this->vecArrayLen * sizeof(char*) );
}
void StrCpyVec_uninit(StrCpyVec* this)
{
kfree(this->vecArray);
StrCpyList_uninit( (StrCpyList*)this);
}
void StrCpyVec_append(StrCpyVec* this, const char* valuePointer)
{
PointerListElem* lastElem;
char* lastElemValuePointer;
StrCpyList_append( (StrCpyList*)this, valuePointer);
// check if we have enough buffer space for new elem
if(StrCpyList_length( (StrCpyList*)this) > this->vecArrayLen)
{ // double vector array size (create new, copy, exchange, delete old)
char** newVecArray = (char**)os_kmalloc(this->vecArrayLen*sizeof(char*)*2);
memcpy(newVecArray, this->vecArray, this->vecArrayLen*sizeof(char*) );
kfree(this->vecArray);
this->vecArrayLen = this->vecArrayLen * 2;
this->vecArray = newVecArray;
}
// get last elem and add the valuePointer to the array
lastElem = PointerList_getTail( (PointerList*)this);
lastElemValuePointer = (char*)lastElem->valuePointer;
(this->vecArray)[StrCpyList_length( (StrCpyList*)this)-1] = lastElemValuePointer;
}
size_t StrCpyVec_length(StrCpyVec* this)
{
return StrCpyList_length( (StrCpyList*)this);
}
char* StrCpyVec_at(StrCpyVec* this, size_t index)
{
BEEGFS_BUG_ON_DEBUG(index >= StrCpyVec_length(this), "Index out of bounds");
return (this->vecArray)[index];
}
void StrCpyVec_clear(StrCpyVec* this)
{
StrCpyList_clear( (StrCpyList*)this);
}
#endif /*STRCPYVEC_H_*/