-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.h
94 lines (73 loc) · 3.5 KB
/
types.h
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#ifndef types_h
#define types_h
#include <allegro5/allegro5.h>
#include <string.h>
#include <math.h>
#include "utils.h"
/** Tipo delle funzioni che si occupano di copiare un valore */
typedef void * (* duplicate_function)(void *);
/** Tipo delle funzioni che si occupano di deallocare un valore */
typedef void (* delete_function)(void *);
/** Tipo delle funzioni che si occupano di confrontare due valori (0 = uguali) */
typedef int (* compare_function)(void *, void *);
/** Tipo delle funzioni che si occupano di calcolare la dimensione, in bytes, di un valore */
typedef size_t (* size_function)(void *);
/**
* Funzioni per gestire un tipo di dato
*/
struct type_functions {
/** Puntatore alla funzione di copia */
duplicate_function duplicate;
/** Puntatore alla funzione di deallocazione */
delete_function delete;
/** Puntatore alla funzione di confronto */
compare_function compare;
/** Puntatore alla funzione di calcolo della dimensione */
size_function size;
};
/**
* Tipo di dato booleano
*/
#ifndef __bool_true_false_are_defined
#ifndef bool
#ifdef _Bool
#define bool _Bool
#else
#define bool int
#endif
#define true 1
#define false 0
#define __bool_true_false_are_defined 1
#endif // bool
#endif // __bool_true_false_are_defined
/**
* Macro per la dichiarazione delle funzioni necessario per gestire un tipo di dato.
* Tutti i parametri sono opzionali ad eccezione di type_name.
*
* @param type_name Nome del tipo di dato
* @param delf Funzione di deallocazione
* @param szf Funzione per il calcolo della dimensione
* @param dupf Funzione di copia
* @param compf Funzione di confronto
*/
#define TYPE_FUNCTIONS_DEFINE(...) OVERLOAD(TYPE_FUNCTIONS_DEFINE_, __VA_ARGS__)
#define TYPE_FUNCTIONS_DEFINE_1(type_name) struct type_functions type_name ## _ ## functions = {NULL, NULL, NULL, NULL}
#define TYPE_FUNCTIONS_DEFINE_2(type_name, delf) struct type_functions type_name ## _ ## functions = {NULL, (delete_function)delf, NULL, NULL}
#define TYPE_FUNCTIONS_DEFINE_3(type_name, delf, szf) struct type_functions type_name ## _ ## functions = {NULL, (delete_function)delf, NULL, (size_function)szf}
#define TYPE_FUNCTIONS_DEFINE_4(type_name, delf, szf, dupf) struct type_functions type_name ## _ ## functions = {(duplicate_function)dupf, (delete_function)delf, NULL, (size_function)szf}
#define TYPE_FUNCTIONS_DEFINE_5(type_name, delf, szf, dupf, compf) struct type_functions type_name ## _ ## functions = {(duplicate_function)dupf, (delete_function)delf, (compare_function)compf, (size_function)szf}
#define TYPE_FUNCTIONS_DECLARE(ty) extern struct type_functions ty ## _ ## functions
// Dimensione minima da allocare quando si crea una stringa
#define STRING_DEFAULT_BUFFER_SIZE 32
// Funzioni per gestire tipo di dato
TYPE_FUNCTIONS_DECLARE(string);
TYPE_FUNCTIONS_DECLARE(long);
TYPE_FUNCTIONS_DECLARE(float);
TYPE_FUNCTIONS_DECLARE(no);
#define long_value(addr) (addr ? *((long *)addr) : 0)
#define bool_value(addr) (!!long_value(addr))
#define float_value(addr) (addr ? *((float *)addr) : 0.f)
#define long_value_nocheck(addr) (*((long *)addr))
#define bool_value_nocheck(addr) (!!long_value_nocheck(addr))
#define float_value_nocheck(addr) (*((float *)addr))
#endif // types_h