add ClientArray struct and functions, add _free() functions

This commit is contained in:
Akos Horvath 2023-05-26 19:29:19 +02:00
parent 434e83d570
commit c66eb85cc6
2 changed files with 103 additions and 4 deletions

86
util.c
View File

@ -79,3 +79,89 @@ bool wm_nodearray_remove(NodeArray *arr, size_t index)
return true;
}
void wm_nodearray_free(NodeArray *arr)
{
assert(arr);
arr->capacity = 0;
arr->size = 0;
free(arr->nodes);
}
void wm_clientarray_init(ClientArray *arr)
{
assert(arr);
arr->capacity = 10;
arr->clients = calloc(arr->capacity, sizeof(TreeNode));
arr->size = 0;
}
void wm_clientarray_push(ClientArray *arr, Client node)
{
assert(arr);
arr->size++;
if (arr->size >= arr->capacity) {
Client* temp = calloc(arr->capacity, sizeof(Client));
memcpy(temp, arr->clients, arr->capacity * sizeof(Client));
free(arr->clients);
size_t old_capacity = arr->capacity;
arr->capacity = old_capacity * 2;
arr->clients = calloc(arr->capacity, sizeof(Client));
memcpy(arr->clients, temp, old_capacity);
free(temp);
arr->clients[arr->size - 1] = node;
return;
}
arr->clients[arr->size - 1] = node;
}
bool wm_clientarray_pop(ClientArray *arr, Client *ret)
{
assert(arr);
if (!ret || !arr)
return false;
if (arr->size == 0)
return false;
*ret = arr->clients[arr->size - 1];
arr->size--;
return true;
}
bool wm_clientarray_remove(ClientArray *arr, size_t index)
{
assert(arr);
if (!arr)
return false;
if (index >= arr->size)
return false;
if (index == arr->size - 1) {
arr->size--;
return true;
}
memmove(arr->clients + index, arr->clients + index+1, arr->size-1 * sizeof(Client));
return true;
}
void wm_clientarray_free(ClientArray *arr)
{
assert(arr);
arr->capacity = 0;
arr->size = 0;
free(arr->clients);
}

21
util.h
View File

@ -5,6 +5,8 @@
#include <stdlib.h>
#include <string.h>
#include "client.h"
#define WM_VERT_LEFT 0
#define WM_VERT_RIGHT 1
#define WM_HORIZ_TOP 0
@ -19,14 +21,18 @@ typedef enum NodeType {
} NodeType;
typedef struct TreeNode TreeNode;
typedef struct NodeArray NodeArray;
typedef struct Client Client;
struct NodeArray {
typedef struct {
TreeNode *nodes;
size_t size;
size_t capacity;
};
} NodeArray;
typedef struct {
Client *clients;
size_t size;
size_t capacity;
} ClientArray;
struct TreeNode {
NodeType type;
@ -49,5 +55,12 @@ void wm_nodearray_init(NodeArray *arr);
void wm_nodearray_push(NodeArray *arr, TreeNode node);
bool wm_nodearray_pop(NodeArray *arr, TreeNode *ret);
bool wm_nodearray_remove(NodeArray *arr, size_t index);
void wm_nodearray_free(NodeArray *arr);
void wm_clientarray_init(ClientArray *arr);
void wm_clientarray_push(ClientArray *arr, Client node);
bool wm_clientarray_pop(ClientArray *arr, Client *ret);
bool wm_clientarray_remove(ClientArray *arr, size_t index);
void wm_clientarray_free(ClientArray *arr);
#endif