GL4Dummies  0.1.7
Référence du fichier fixed_heap.c

gestion de tas d'éléments à taille fixe. Plus de détails...

#include "fixed_heap.h"
#include <stdlib.h>
#include <assert.h>
Graphe des dépendances par inclusion de fixed_heap.c:

Aller au code source de ce fichier.

Structures de données

struct  fheap_t
 

Définitions de type

typedef struct fheap_t fheap_t
 

Fonctions

static fheap_t _newheap (size_t nmem, size_t size)
 
static void _moreheap (fheap_t *h)
 
static void _push (size_t *stack, size_t *head, size_t value)
 
static size_t _pop (size_t *stack, size_t *head)
 
static int _empty (size_t head)
 
size_t fheapCreate (size_t nmem, size_t size)
 créé un tas de nmem éléments de taille size et retourne son id (<>0). Plus de détails...
 
size_t fheapPut (size_t heap_id, void *element)
 insert, en copiant le contenu, un élément dans le tas et retourne son id (<>0). Plus de détails...
 
void * fheapGet (size_t heap_id, size_t element_id)
 récupère un élément du tas et retourne le pointeur vers la donnée. Attention, cette fonction n'efface pas la donnée du tas. Plus de détails...
 
void fheapDelete (size_t heap_id, size_t element_id)
 libère une donnée du tas (étiquette une donnée du tas comme espace libre). Plus de détails...
 
void fheapDestroy (size_t heap_id)
 libère l'ensemble du tas et sa mémoire. Plus de détails...
 
void fheapClean (void)
 libère tous les tas créés par cette bibliothèque. Plus de détails...
 

Variables

static fheap_t _heap = { 16, sizeof _heap, NULL, NULL, 0 }
 

Description détaillée

gestion de tas d'éléments à taille fixe.

Auteur
Farès BELHADJ amsi@.nosp@m.ai.u.nosp@m.niv-p.nosp@m.aris.nosp@m.8.fr
Date
November 30, 2016

Définition dans le fichier fixed_heap.c.

Documentation des définitions de type

◆ fheap_t

typedef struct fheap_t fheap_t

Documentation des fonctions

◆ _empty()

static int _empty ( size_t  head)
inlinestatic
154  {
155  return head == 0;
156 }

Référencé par fheapCreate(), et fheapPut().

◆ _moreheap()

static void _moreheap ( fheap_t h)
static
133  {
134  size_t i, onmem = h->nmem;
135  h->nmem <<= 1;
136  h->heap = realloc(h->heap, h->nmem * h->size * sizeof *(h->heap));
137  assert(h->heap);
138  memset(&(h->heap[(h->nmem >> 1) * h->size]), 0, (h->nmem >> 1) * h->size);
139  h->stack = realloc(h->stack, h->nmem * sizeof *(h->stack));
140  assert(h->stack);
141  h->head = 0;
142  for(i = onmem; i < h->nmem; ++i)
143  _push(h->stack, &(h->head), onmem + h->nmem - 1 - i);
144 }

Références _push(), fheap_t::head, fheap_t::heap, fheap_t::nmem, fheap_t::size, et fheap_t::stack.

Référencé par fheapCreate(), et fheapPut().

◆ _newheap()

static fheap_t _newheap ( size_t  nmem,
size_t  size 
)
static
118  {
119  size_t i;
120  fheap_t h;
121  h.nmem = nmem;
122  h.size = size;
123  h.heap = calloc(nmem, size * sizeof *(h.heap));
124  assert(h.heap);
125  h.stack = malloc(nmem * sizeof *(h.stack));
126  assert(h.stack);
127  h.head = 0;
128  for(i = 0; i < nmem; ++i)
129  _push(h.stack, &(h.head), nmem - 1 - i);
130  return h;
131 }

Références _push(), fheap_t::head, fheap_t::heap, fheap_t::nmem, fheap_t::size, et fheap_t::stack.

Référencé par fheapCreate().

◆ _pop()

static size_t _pop ( size_t *  stack,
size_t *  head 
)
inlinestatic
150  {
151  return stack[--(*head)] + 1;
152 }

Référencé par fheapCreate(), et fheapPut().

◆ _push()

static void _push ( size_t *  stack,
size_t *  head,
size_t  value 
)
inlinestatic
146  {
147  stack[(*head)++] = value;
148 }

Référencé par _moreheap(), _newheap(), fheapDelete(), et fheapDestroy().

◆ fheapClean()

void fheapClean ( void  )

libère tous les tas créés par cette bibliothèque.

101  {
102  size_t i;
103  fheap_t * h;
104  if(!_heap.heap) return;
105  for(i = 0; i < _heap.nmem; i++) {
106  h = &(((fheap_t * )_heap.heap)[i]);
107  if(h->heap)
108  fheapDestroy(i + 1);
109  }
110  free(_heap.heap);
111  _heap.heap = NULL;
112  free(_heap.stack);
113  _heap.stack = NULL;
114  _heap.head = 0;
115  _heap.size = 16;
116 }

Références _heap, fheapDestroy(), fheap_t::head, fheap_t::heap, fheap_t::nmem, fheap_t::size, et fheap_t::stack.

Référencé par fheapCreate().

◆ fheapCreate()

size_t fheapCreate ( size_t  nmem,
size_t  size 
)

créé un tas de nmem éléments de taille size et retourne son id (<>0).

Paramètres
nmemnombre initial d'éléments dans le tas.
sizetaille, en octets, d'éléments du tas.
Renvoie
identifiant du tas créé (différent de 0).
34  {
35  fheap_t * h;
36  size_t heap_id;
37  static int ft = 1;
38  if(_heap.heap == NULL) {
40  if(ft) gl4duAtExit(fheapClean);
41  ft = 0;
42  }
43  heap_id = _pop(_heap.stack, &(_heap.head));
44  if(_empty(_heap.head))
45  _moreheap(&_heap);
46  h = &(((fheap_t * )_heap.heap)[heap_id - 1]);
47  *h =_newheap(nmem, size);
48  return heap_id;
49 }

Références _empty(), _heap, _moreheap(), _newheap(), _pop(), fheapClean(), gl4duAtExit(), fheap_t::head, fheap_t::heap, fheap_t::nmem, fheap_t::size, et fheap_t::stack.

◆ fheapDelete()

void fheapDelete ( size_t  heap_id,
size_t  element_id 
)

libère une donnée du tas (étiquette une donnée du tas comme espace libre).

Paramètres
heap_ididentifiant du tas duquel la donnée est libérée.
element_ididentifiant de la donnée à libérer.
82  {
83  fheap_t * h = &(((fheap_t * )_heap.heap)[heap_id - 1]);
84  _push(h->stack, &(h->head), --element_id);
85 }

Références _heap, _push(), fheap_t::head, fheap_t::heap, et fheap_t::stack.

◆ fheapDestroy()

void fheapDestroy ( size_t  heap_id)

libère l'ensemble du tas et sa mémoire.

Paramètres
heap_ididentifiant du tas à libérer.
90  {
91  fheap_t * h = &(((fheap_t * )_heap.heap)[heap_id - 1]);
92  free(h->heap);
93  h->heap = NULL;
94  free(h->stack);
95  h->stack = NULL;
96  _push(_heap.stack, &(_heap.head), heap_id - 1);
97 }

Références _heap, _push(), fheap_t::head, fheap_t::heap, et fheap_t::stack.

Référencé par fheapClean().

◆ fheapGet()

void* fheapGet ( size_t  heap_id,
size_t  element_id 
)

récupère un élément du tas et retourne le pointeur vers la donnée. Attention, cette fonction n'efface pas la donnée du tas.

Paramètres
heap_ididentifiant du tas duquel est extraite la donnée.
element_ididentifiant de la donnée à extraire.
Renvoie
pointeur vers la donnée extraite.
72  {
73  fheap_t * h = &(((fheap_t * )_heap.heap)[heap_id - 1]);
74  return &(h->heap[--element_id * h->size]);
75 }

Références _heap, fheap_t::heap, et fheap_t::size.

◆ fheapPut()

size_t fheapPut ( size_t  heap_id,
void *  element 
)

insert, en copiant le contenu, un élément dans le tas et retourne son id (<>0).

Paramètres
heap_ididentifiant du tas dans lequel se passe l'insertion.
elementpointeur vers la donnée à insérer (copier).
Renvoie
identifiant de l'élément inséré dans le tas (différent de 0).
57  {
58  fheap_t * h = &(((fheap_t * )_heap.heap)[heap_id - 1]);
59  size_t element_id = _pop(h->stack, &(h->head));
60  if(_empty(h->head))
61  _moreheap(h);
62  memcpy(&(h->heap[(element_id - 1) * h->size]), element, h->size);
63  return element_id;
64 }

Références _empty(), _heap, _moreheap(), _pop(), fheap_t::head, fheap_t::heap, fheap_t::size, et fheap_t::stack.

Documentation des variables

◆ _heap

fheap_t _heap = { 16, sizeof _heap, NULL, NULL, 0 }
static
_heap
static fheap_t _heap
Definition: fixed_heap.c:26
gl4duAtExit
void gl4duAtExit(void(*func)(void))
ajoute func dans la liste des fonctions à appeler lors du gl4duClean avec l'argument GL4DU_AT_EXIT ou...
Definition: gl4du.c:616
_pop
static size_t _pop(size_t *stack, size_t *head)
Definition: fixed_heap.c:150
_empty
static int _empty(size_t head)
Definition: fixed_heap.c:154
fheap_t::heap
char * heap
Definition: fixed_heap.c:16
fheap_t::nmem
size_t nmem
Definition: fixed_heap.c:15
_newheap
static fheap_t _newheap(size_t nmem, size_t size)
Definition: fixed_heap.c:118
fheap_t::stack
size_t * stack
Definition: fixed_heap.c:17
fheap_t::head
size_t head
Definition: fixed_heap.c:17
fheapClean
void fheapClean(void)
libère tous les tas créés par cette bibliothèque.
Definition: fixed_heap.c:101
fheap_t::size
size_t size
Definition: fixed_heap.c:15
fheapDestroy
void fheapDestroy(size_t heap_id)
libère l'ensemble du tas et sa mémoire.
Definition: fixed_heap.c:90
_push
static void _push(size_t *stack, size_t *head, size_t value)
Definition: fixed_heap.c:146
_moreheap
static void _moreheap(fheap_t *h)
Definition: fixed_heap.c:133
fheap_t
Definition: fixed_heap.c:14