FreeRDP
Loading...
Searching...
No Matches
pod_arrays.h
1
19#ifndef FREERDP_UTILS_POD_ARRAYS_H_
20#define FREERDP_UTILS_POD_ARRAYS_H_
21
22#include <winpr/wtypes.h>
23#include <winpr/assert.h>
24
25#ifdef __cplusplus
26extern "C"
27{
28#endif
29
30#define POD_ARRAYS_IMPL(T, TLOWER) \
31 typedef struct \
32 { \
33 T* values; \
34 size_t nvalues; \
35 } Array##T; \
36 typedef BOOL Array##T##Cb(T* v, void* data); \
37 \
38 static inline void array_##TLOWER##_init(Array##T* a) \
39 { \
40 WINPR_ASSERT(a); \
41 a->values = NULL; \
42 a->nvalues = 0; \
43 } \
44 \
45 WINPR_ATTR_NODISCARD \
46 static inline size_t array_##TLOWER##_size(const Array##T* a) \
47 { \
48 WINPR_ASSERT(a); \
49 return a->nvalues; \
50 } \
51 \
52 WINPR_ATTR_NODISCARD \
53 static inline T* array_##TLOWER##_data(const Array##T* a) \
54 { \
55 WINPR_ASSERT(a); \
56 return a->values; \
57 } \
58 \
59 WINPR_ATTR_NODISCARD \
60 static inline const T* array_##TLOWER##_cdata(const Array##T* a) \
61 { \
62 WINPR_ASSERT(a); \
63 return (const T*)a->values; \
64 } \
65 \
66 WINPR_ATTR_NODISCARD \
67 static inline T array_##TLOWER##_get(const Array##T* a, size_t idx) \
68 { \
69 WINPR_ASSERT(a); \
70 WINPR_ASSERT(a->nvalues > idx); \
71 return a->values[idx]; \
72 } \
73 \
74 static inline void array_##TLOWER##_set(Array##T* a, size_t idx, T v) \
75 { \
76 WINPR_ASSERT(a); \
77 WINPR_ASSERT(a->nvalues > idx); \
78 a->values[idx] = v; \
79 } \
80 \
81 WINPR_ATTR_NODISCARD \
82 static inline BOOL array_##TLOWER##_append(Array##T* a, T v) \
83 { \
84 WINPR_ASSERT(a); \
85 T* tmp = realloc(a->values, sizeof(T) * (a->nvalues + 1)); \
86 if (!tmp) \
87 return FALSE; \
88 \
89 tmp[a->nvalues] = v; \
90 a->values = tmp; \
91 a->nvalues++; \
92 return TRUE; \
93 } \
94 \
95 WINPR_ATTR_NODISCARD \
96 static inline BOOL array_##TLOWER##_contains(const Array##T* a, T v) \
97 { \
98 WINPR_ASSERT(a); \
99 \
100 for (UINT32 i = 0; i < a->nvalues; i++) \
101 { \
102 if (memcmp(&a->values[i], &v, sizeof(T)) == 0) \
103 return TRUE; \
104 } \
105 \
106 return FALSE; \
107 } \
108 \
109 WINPR_ATTR_NODISCARD \
110 static inline BOOL array_##TLOWER##_foreach(Array##T* a, Array##T##Cb cb, void* data) \
111 { \
112 WINPR_ASSERT(a); \
113 for (size_t i = 0; i < a->nvalues; i++) \
114 { \
115 if (!cb(&a->values[i], data)) \
116 return FALSE; \
117 } \
118 \
119 return TRUE; \
120 } \
121 \
122 static inline void array_##TLOWER##_reset(Array##T* a) \
123 { \
124 WINPR_ASSERT(a); \
125 a->nvalues = 0; \
126 } \
127 \
128 static inline void array_##TLOWER##_uninit(Array##T* a) \
129 { \
130 WINPR_ASSERT(a); \
131 free(a->values); \
132 \
133 a->values = NULL; \
134 a->nvalues = 0; \
135 }
136
137 POD_ARRAYS_IMPL(UINT16, uint16)
138 POD_ARRAYS_IMPL(UINT32, uint32)
139 POD_ARRAYS_IMPL(UINT64, uint64)
140
141#ifdef __cplusplus
142}
143#endif
144
145#endif /* FREERDP_UTILS_POD_ARRAYS_H_ */