summaryrefslogtreecommitdiffstats
path: root/02_exercise/array.c
blob: 4f083669140bf774fb335a9fbe0e6b0c5408e9c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/***************************************************************************//**
 * @file array.c
 * @author Dorian Weber
 * @brief Implementation des generalisierten Arrays.
 ******************************************************************************/

#include "array.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

/* ********************************************************* public functions */

/* (die runden Klammern um einige Funktionsnamen sind notwendig, da Makros
 * gleichen Namens existieren und der Präprozessor diese expandieren würde) */

void* (arrayInit)(size_t capacity, size_t size) {
	ArrayHdr *hdr = malloc(sizeof(*hdr) + size*capacity);
	
	if (hdr == NULL)
		return NULL;
	
	hdr->len = 0;
	hdr->cap = capacity;
	
	return hdr + 1;
}

void arrayRelease(void* self) {
	free(((ArrayHdr*) self) - 1);
}

void* (arrayPush)(void* self, size_t size) {
	ArrayHdr *hdr = ((ArrayHdr*) self) - 1;
	
	if (hdr->len == hdr->cap) {
		hdr->cap *= 2;
		hdr = realloc(hdr, sizeof(*hdr) + size*hdr->cap);
		
		if (hdr == NULL) {
			fputs("program ran out of heap memory\n", stderr);
			exit(-1);
		}
	}
	
	++hdr->len;
	return hdr + 1;
}

void (arrayPop)(void* self) {
	ArrayHdr *hdr = ((ArrayHdr*) self) - 1;
	assert(hdr->len > 0);
	--hdr->len;
}

/* Symbol für die Inline-Funktionen erzeugen und aus diesem Modul exportieren */
extern void arrayClear(void* self);
extern int arrayIsEmpty(const void* self);
extern size_t arrayLen(const void* self);