https://github.com/stepainpy/common-da
Implement common dynamic array type for C99 and later
https://github.com/stepainpy/common-da
Last synced: 5 months ago
JSON representation
Implement common dynamic array type for C99 and later
- Host: GitHub
- URL: https://github.com/stepainpy/common-da
- Owner: Stepainpy
- License: mit
- Created: 2025-02-01T07:37:27.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-03-19T20:48:07.000Z (about 1 year ago)
- Last Synced: 2025-06-15T20:32:03.637Z (10 months ago)
- Language: C
- Size: 21.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Common dynamic array
## Overview
Implementation dynamic array without depend the stored type. Object of type `da_t` save information about stored type (size and destruction function). When creating new `da` need set size of stored type and destructor if necessary.
## Usage
### Creating and using `da`
``` c
DA_CREATE_VAR(da, int, NULL); // place 'da' to stack
/* ... some code ... */
size_t length = da.count; // access to field
da_some_func(&da, ...);
```
### Access to items
- `da_at_fwd` - get pointer to item by index as return value
- `da_at` - get pointer to item by index
- `da_front` - get pointer to first item
- `da_back` - get pointer to last item
### Adding items
- `da_insert` - insert value from pointer into position by index
- `da_insert_imm` - insert value into position by index
- `da_insert_many` - insert values from array into position by index
- `da_push_back` - insert value from pointer into last position
- `da_push_back_imm` - insert value into last position
- `da_push_back_many` - insert value from array into last position
### Removing items
- `da_remove` - remove item by index
- `da_remove_many` - remove items by indexes in range
- `da_pop_back` - remove last item
- `da_pop_back_many` - remove N-last items
### Deletion items
- `da_clear` - remove all items and save capacity
- `da_destroy` - remove all items and free allocated memory
### Capacity manipulation
- `da_reserve` - reserve memory for N-items
- `da_shrink_to_fit` - deallocate free capacity
## Pre-include macros
- `DA_IMPLEMENTATION` - add definition of functions
- `DA_DEF` - User-provided attributes (as an example: `__declspec(dllexport)`)
- `DA_INIT_CAP` - default start capacity for empty `da`
## Provided macros
- `DA_CREATE_VAR` - initialize new variable of type `da_t`
- `DA_FOREACH` - expand to header (`for` with brackets) for for-loop and iterable by `da`
- `DA_VOID_FOREACH` - as `DA_FOREACH`, but use `void *` iterator variable
## Example
Print command line arguments
``` c
#define DA_IMPLEMENTATION
#include "common_da.h"
#include
int main(int argc, char** argv) {
DA_CREATE_VAR(args, const char*, NULL);
da_error_t err;
err = da_push_back_many(&args, argv, argc);
if (err != dae_success) { // error check
fprintf(stderr, "%s\n", da_error_to_str(err));
return 1;
}
size_t i = 0;
printf("argc = %zu\n", args.count);
DA_FOREACH(const char*, arg, &args) {
printf("argv[%zu] = %s\n", i++, *arg);
}
da_destroy(&args);
return 0;
}
```
Possible output
``` console
$ ./main foo bar baz
argc = 4
argv[0] = main.exe
argv[1] = foo
argv[2] = bar
argv[3] = baz
```