Added pop and made empty's return make more sense.
This commit is contained in:
parent
29597aecaf
commit
c80b38d82d
3 changed files with 51 additions and 17 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define ARRAY_GROWTH_MULTIPLIER 1.3
|
#define ARRAY_GROWTH_MULTIPLIER 1.3
|
||||||
|
|
||||||
void *dyn_arr_init(size_t item_size, size_t capacity) {
|
void *dyn_arr_init(size_t item_size, size_t capacity) {
|
||||||
|
|
@ -19,13 +20,6 @@ void *dyn_arr_init(size_t item_size, size_t capacity) {
|
||||||
return dyna_ptr;
|
return dyna_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dyna_empty(void *array) {
|
|
||||||
if (dyna_length(array) == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) {
|
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) {
|
||||||
dyna_header *header = dyna_get_header(array);
|
dyna_header *header = dyna_get_header(array);
|
||||||
size_t minimum_capacity = header->length + item_count;
|
size_t minimum_capacity = header->length + item_count;
|
||||||
|
|
@ -44,3 +38,31 @@ void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) {
|
||||||
header->capacity = new_capacity;
|
header->capacity = new_capacity;
|
||||||
return header + 1;
|
return header + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dyn_arr_pop(void *array, size_t item_size) {
|
||||||
|
if (dyna_empty(array)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dyna_length(array)--;
|
||||||
|
|
||||||
|
// Shrink if smaller than growth factor, may break if growth factor is > 2
|
||||||
|
if (dyna_length(array) >
|
||||||
|
(2 - ARRAY_GROWTH_MULTIPLIER) * dyna_capacity(array)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t new_capacity = dyna_length(array) * ARRAY_GROWTH_MULTIPLIER;
|
||||||
|
dyna_capacity(array) = new_capacity;
|
||||||
|
|
||||||
|
size_t new_size = sizeof(dyna_header) + new_capacity * item_size;
|
||||||
|
dyna_header *header = dyna_get_header(array);
|
||||||
|
header = realloc(dyna_get_header(array), new_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dyna_empty(void *array) {
|
||||||
|
if (dyna_length(array) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define ARRAY_INITIAL_CAPACITY 4
|
#define ARRAY_INITIAL_CAPACITY 4
|
||||||
|
|
||||||
|
|
@ -10,13 +10,16 @@
|
||||||
* - Capacity
|
* - Capacity
|
||||||
* - shrink capacity to size
|
* - shrink capacity to size
|
||||||
* - Modifiers
|
* - Modifiers
|
||||||
* - clear
|
* - clear aka erase
|
||||||
* - insert
|
* - insert
|
||||||
* - (optional) insert range
|
* - (optional) insert range
|
||||||
* - pop
|
* - pop
|
||||||
* - (optional) swap
|
* - (optional) swap
|
||||||
* - (optional) resize
|
* - (optional) resize
|
||||||
*/
|
* - Sanity checks
|
||||||
|
* - Check data going into array is the right size
|
||||||
|
* - see if possible to check entered data is correct type
|
||||||
|
*/
|
||||||
|
|
||||||
typedef struct dyna_header {
|
typedef struct dyna_header {
|
||||||
size_t capacity;
|
size_t capacity;
|
||||||
|
|
@ -27,14 +30,19 @@ typedef struct dyna_header {
|
||||||
#define dyna_init(T) (T *)dyn_arr_init(sizeof(T), ARRAY_INITIAL_CAPACITY)
|
#define dyna_init(T) (T *)dyn_arr_init(sizeof(T), ARRAY_INITIAL_CAPACITY)
|
||||||
void *dyn_arr_init(size_t item_size, size_t capacity);
|
void *dyn_arr_init(size_t item_size, size_t capacity);
|
||||||
|
|
||||||
|
// Modification
|
||||||
#define dyna_append(array, value) \
|
#define dyna_append(array, value) \
|
||||||
((array) = dyna_ensure_capacity(array, 1, sizeof(value)), \
|
((array) = dyna_ensure_capacity(array, 1, sizeof(value)), \
|
||||||
(array)[dyna_get_header(array)->length] = (value), \
|
(array)[dyna_get_header(array)->length] = (value), \
|
||||||
&(array)[dyna_get_header(array)->length++])
|
&(array)[dyna_get_header(array)->length++])
|
||||||
|
|
||||||
|
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size);
|
||||||
|
|
||||||
|
#define dyna_pop(array) dyn_arr_pop(array, sizeof(typeof(*array)))
|
||||||
|
void dyn_arr_pop(void *array, size_t item_size);
|
||||||
|
|
||||||
// Get meta data
|
// Get meta data
|
||||||
#define dyna_get_header(array) ((dyna_header *)(array)-1)
|
#define dyna_get_header(array) ((dyna_header *)(array)-1)
|
||||||
#define dyna_length(array) (dyna_get_header(array)->length)
|
#define dyna_length(array) (dyna_get_header(array)->length)
|
||||||
#define dyna_capacity(array) (dyna_get_header(array)->capacity)
|
#define dyna_capacity(array) (dyna_get_header(array)->capacity)
|
||||||
bool dyna_empty(void* array);
|
bool dyna_empty(void *array);
|
||||||
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size);
|
|
||||||
|
|
|
||||||
14
src/main.c
14
src/main.c
|
|
@ -1,16 +1,20 @@
|
||||||
#include "dyn_arr.h"
|
#include "dyn_arr.h"
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int *dyna_array = dyna_init(int);
|
uint64_t *dyna_array = dyna_init(uint64_t);
|
||||||
printf("empty %d\n", dyna_empty(dyna_array));
|
|
||||||
|
|
||||||
for (int i = 0; i < 999999999; i++) {
|
for (uint64_t i = 0; i < 9999999; i++) {
|
||||||
dyna_append(dyna_array, i);
|
dyna_append(dyna_array, i);
|
||||||
}
|
}
|
||||||
printf("capacity %zu\n", dyna_capacity(dyna_array));
|
|
||||||
printf("empty %d\n", dyna_empty(dyna_array));
|
for (uint64_t i = 9999999; i > 0; i--) {
|
||||||
|
printf("length: %zu capacity: %zu\n", dyna_array[i],
|
||||||
|
dyna_capacity(dyna_array));
|
||||||
|
dyna_pop(dyna_array);
|
||||||
|
}
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue