Yume Project 3.0
Touhou-inspired Danmaku game made in C only
Chargement...
Recherche...
Aucune correspondance
Référence du fichier dynarray.h
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include "core/macro.h"

Aller au code source de ce fichier.

Macros

#define auto   __auto_type
#define DYNAMIC_ARRAY_BASE(type_elem)
 base d'un tableau dynamique
#define DYNAMIC_ARRAY(elem_type)
 Déclaration d'un tableau dynamique.
#define DYNARRAY_CAST_TO_BASE(darr)
 Renvoie pointeur vers le tableau générique.
#define DYNARRAY_ELEM_SIZE(darr)
 Renvoie la taille d'un élément du tableau.
#define _dynarray_func(func, darr, ...)
 "Traducteurs" pour les fonctions dynarray
#define _dynarray_func_noargs(func, darr)
#define dynarray_free_data(darr)
#define dynarray_ensure_capacity(darr, capacity)
#define dynarray_get_ptr(darr, idx)
 Renvoie le pointeur vers data[idx].
#define _dynarray_append_min_capacity(darr, min_capacity, ...)
#define dynarray_append(darr, ...)
#define dynarray_compact(darr)
#define dynarray_qsort(darr, compare_func)
 Trie le tableau de data par un qsort.
#define dynarray_get(darr, idx)
 Renvoie la valeur de data[idx].
#define dynarray_set(darr, idx, ...)
 Modifie la valeur de data[idx].
#define dynarray_set_elements(darr, num_elements, elements)
#define dynarray_filter(darr, predicate, userdata)
#define dynarray_indexof(darr, elem_p)
 Renvoie l'indice d'elem dans le tableau.
#define _dynarray_foreach_iter   MACRO_ADDLINENUM(dynarray_foreach_iter)
 Pour créer des variables itérables a priori uniques (sinon les boucles imbriquées flop).
#define _dynarray_foreach_temp   MACRO_ADDLINENUM(dynarray_foreach_temp)
#define dynarray_foreach(darr, var, elem_var, ...)
 Boucle sur le tableau avec var = id, elem_var = pointeur sur data[idx].
#define dynarray_foreach_elem(darr, elem_var, ...)
 boucle sur le tableau avec elem_var = pointeur sur les éléments
#define dynarray_foreach_idx(darr, var, ...)
 boucle sur le tableau avec var = id

Définitions de type

typedef uint32_t dynarray_size_t
typedef bool(* dynarray_filter_t) (const void *elem_p, void *userdata)
 Fonction qui filtre un tableau.

Fonctions

typedef DYNAMIC_ARRAY_BASE (void) DynamicArray
 Tableau dynamique générique (data est un pointeur universel).
void _dynarray_free_data (dynarray_size_t sizeof_element, DynamicArray *darr)
 Libère la mémoire du data d'un dynarray.
void _dynarray_ensure_capacity (dynarray_size_t sizeof_element, DynamicArray *darr, dynarray_size_t capacity)
 Fait en sorte que la capacité du tableau soit au moins capacity.
dynarray_size_t _dynarray_prepare_append_min_capacity (dynarray_size_t sizeof_element, DynamicArray *darr, dynarray_size_t min_capacity)
 Vérifie qu'il y a la capacité nécessaire pour append et en alloue si besoin.
void _dynarray_compact (dynarray_size_t sizeof_element, DynamicArray *darr)
 Fait en sorte qu'il n'y ait pas de mémoire vide dans data.
void _dynarray_set_elements (dynarray_size_t sizeof_element, DynamicArray *darr, dynarray_size_t num_elements, void *elements)
 Rentre un tableau d'elements dans le tableau dynamique.
void _dynarray_filter (dynarray_size_t sizeof_element, DynamicArray *darr, dynarray_filter_t predicate, void *userdata)
 Modifie un tableau pour ne garder que les valeurs respectant le filtre.

Documentation des macros

◆ _dynarray_append_min_capacity

#define _dynarray_append_min_capacity ( darr,
min_capacity,
... )
Valeur :
({ \
auto elem_p = dynarray_get_ptr(darr, _dynarray_func(prepare_append_min_capacity, darr, min_capacity)); \
__VA_OPT__(*elem_p = ((typeof(*elem_p)) __VA_ARGS__); ) \
elem_p; \
})
#define _dynarray_func(func, darr,...)
"Traducteurs" pour les fonctions dynarray
Definition dynarray.h:61
#define dynarray_get_ptr(darr, idx)
Renvoie le pointeur vers data[idx].
Definition dynarray.h:98

◆ _dynarray_foreach_iter

#define _dynarray_foreach_iter   MACRO_ADDLINENUM(dynarray_foreach_iter)

Pour créer des variables itérables a priori uniques (sinon les boucles imbriquées flop).

◆ _dynarray_foreach_temp

#define _dynarray_foreach_temp   MACRO_ADDLINENUM(dynarray_foreach_temp)

◆ _dynarray_func

#define _dynarray_func ( func,
darr,
... )
Valeur :
_dynarray_##func(DYNARRAY_ELEM_SIZE(darr), DYNARRAY_CAST_TO_BASE(darr), __VA_ARGS__)
#define DYNARRAY_ELEM_SIZE(darr)
Renvoie la taille d'un élément du tableau.
Definition dynarray.h:53
#define DYNARRAY_CAST_TO_BASE(darr)
Renvoie pointeur vers le tableau générique.
Definition dynarray.h:48

"Traducteurs" pour les fonctions dynarray

Comme a chaque fois il faut passer en param la taille d'un element et le pointeur vers le tableau cette macro gère ça toute seule sinon c chiant d'écrire a la main a chaque fois

◆ _dynarray_func_noargs

#define _dynarray_func_noargs ( func,
darr )
Valeur :
_dynarray_##func(DYNARRAY_ELEM_SIZE(darr), DYNARRAY_CAST_TO_BASE(darr))

◆ auto

#define auto   __auto_type

◆ DYNAMIC_ARRAY

#define DYNAMIC_ARRAY ( elem_type)
Valeur :
union { \
DYNAMIC_ARRAY_BASE(elem_type); \
DynamicArray din_array; \
}

Déclaration d'un tableau dynamique.

Petit tricks de batard pour a la fois avoir une sécurité sur le type du tableau et en meme temps pouvoir utiliser les fonctions génériques

◆ DYNAMIC_ARRAY_BASE

#define DYNAMIC_ARRAY_BASE ( type_elem)
Valeur :
struct { \
type_elem *data; \
dynarray_size_t num_elements; \
dynarray_size_t capacity; \
}
uint32_t dynarray_size_t
Definition dynarray.h:10

base d'un tableau dynamique

Un tableau dynamique homogène avec son type num_elements -> nombre d'elem courrants capacity -> taille max du tableau

◆ dynarray_append

#define dynarray_append ( darr,
... )
Valeur :
_dynarray_append_min_capacity(darr, 2, ##__VA_ARGS__);
#define _dynarray_append_min_capacity(darr, min_capacity,...)
Definition dynarray.h:102

◆ DYNARRAY_CAST_TO_BASE

#define DYNARRAY_CAST_TO_BASE ( darr)
Valeur :
&(darr)->din_array

Renvoie pointeur vers le tableau générique.

◆ dynarray_compact

#define dynarray_compact ( darr)
Valeur :
_dynarray_func_noargs(compact, darr)
#define _dynarray_func_noargs(func, darr)
Definition dynarray.h:63

◆ DYNARRAY_ELEM_SIZE

#define DYNARRAY_ELEM_SIZE ( darr)
Valeur :
sizeof(*(darr)->data)

Renvoie la taille d'un élément du tableau.

◆ dynarray_ensure_capacity

#define dynarray_ensure_capacity ( darr,
capacity )
Valeur :
_dynarray_func(ensure_capacity, darr, capacity)

◆ dynarray_filter

#define dynarray_filter ( darr,
predicate,
userdata )
Valeur :
_dynarray_func(filter, darr, predicate, userdata)

◆ dynarray_foreach

#define dynarray_foreach ( darr,
var,
elem_var,
... )
Valeur :
do { \
_dynarray_foreach_iter < (darr)->num_elements; _dynarray_foreach_iter++) { \
elem_var = dynarray_get_ptr(darr, var); \
__VA_ARGS__; \
} \
} while(0)
#define _dynarray_foreach_iter
Pour créer des variables itérables a priori uniques (sinon les boucles imbriquées flop).
Definition dynarray.h:179

Boucle sur le tableau avec var = id, elem_var = pointeur sur data[idx].

◆ dynarray_foreach_elem

#define dynarray_foreach_elem ( darr,
elem_var,
... )
Valeur :
elem_var, \
__VA_ARGS__ \
)
#define dynarray_foreach(darr, var, elem_var,...)
Boucle sur le tableau avec var = id, elem_var = pointeur sur data[idx].
Definition dynarray.h:185
#define _dynarray_foreach_temp
Definition dynarray.h:180

boucle sur le tableau avec elem_var = pointeur sur les éléments

◆ dynarray_foreach_idx

#define dynarray_foreach_idx ( darr,
var,
... )
Valeur :
var, \
__VA_ARGS__ \
)

boucle sur le tableau avec var = id

◆ dynarray_free_data

#define dynarray_free_data ( darr)
Valeur :
_dynarray_func_noargs(free_data, darr)

◆ dynarray_get

#define dynarray_get ( darr,
idx )
Valeur :
(*dynarray_get_ptr(darr, idx))

Renvoie la valeur de data[idx].

◆ dynarray_get_ptr

#define dynarray_get_ptr ( darr,
idx )
Valeur :
({ \
(darr)->data + idx; \
})

Renvoie le pointeur vers data[idx].

◆ dynarray_indexof

#define dynarray_indexof ( darr,
elem_p )
Valeur :
({ \
int idx = (int)(elem_p - darr->data;) \
})

Renvoie l'indice d'elem dans le tableau.

◆ dynarray_qsort

#define dynarray_qsort ( darr,
compare_func )
Valeur :
do { \
DynamicArray *b_darr = DYNARRAY_CAST_TO_BASE(darr); \
if (b_darr->data) { \
qsort(b_darr->data, b_darr->num_elements, DYNARRAY_ELEM_SIZE(darr), (compare_func)); \
} \
} while(0)

Trie le tableau de data par un qsort.

◆ dynarray_set

#define dynarray_set ( darr,
idx,
... )
Valeur :
(*dynarray_get_ptr(darr, idx) = (__VA_ARGS__))

Modifie la valeur de data[idx].

◆ dynarray_set_elements

#define dynarray_set_elements ( darr,
num_elements,
elements )
Valeur :
_dynarray_func(set_elements, darr, num_elements, elements)

Documentation des définitions de type

◆ dynarray_filter_t

typedef bool(* dynarray_filter_t) (const void *elem_p, void *userdata)

Fonction qui filtre un tableau.

◆ dynarray_size_t

typedef uint32_t dynarray_size_t

Documentation des fonctions

◆ _dynarray_compact()

void _dynarray_compact ( dynarray_size_t sizeof_element,
DynamicArray * darr )

Fait en sorte qu'il n'y ait pas de mémoire vide dans data.

Paramètres
sizeof_element
darr

◆ _dynarray_ensure_capacity()

void _dynarray_ensure_capacity ( dynarray_size_t sizeof_element,
DynamicArray * darr,
dynarray_size_t capacity )

Fait en sorte que la capacité du tableau soit au moins capacity.

Paramètres
sizeof_element
darr
capacity

◆ _dynarray_filter()

void _dynarray_filter ( dynarray_size_t sizeof_element,
DynamicArray * darr,
dynarray_filter_t predicate,
void * userdata )

Modifie un tableau pour ne garder que les valeurs respectant le filtre.

Paramètres
sizeof_element
darr
filter
userdata

◆ _dynarray_free_data()

void _dynarray_free_data ( dynarray_size_t sizeof_element,
DynamicArray * darr )

Libère la mémoire du data d'un dynarray.

Paramètres
sizeof_element
darr

◆ _dynarray_prepare_append_min_capacity()

dynarray_size_t _dynarray_prepare_append_min_capacity ( dynarray_size_t sizeof_element,
DynamicArray * darr,
dynarray_size_t min_capacity )

Vérifie qu'il y a la capacité nécessaire pour append et en alloue si besoin.

Paramètres
sizeof_element
darr
min_capacity
Renvoie
dynarray_size_t : Indice d'insertion

◆ _dynarray_set_elements()

void _dynarray_set_elements ( dynarray_size_t sizeof_element,
DynamicArray * darr,
dynarray_size_t num_elements,
void * elements )

Rentre un tableau d'elements dans le tableau dynamique.

Paramètres
sizeof_element
darr
num_elementsnombre d'éléments a insérer
elementstableau d'éléments

◆ DYNAMIC_ARRAY_BASE()

typedef DYNAMIC_ARRAY_BASE ( void )

Tableau dynamique générique (data est un pointeur universel).

Renvoie
typedef