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 static INLINE size_t array_##TLOWER##_size(const Array##T* a) \
46 { \
47 WINPR_ASSERT(a); \
48 return a->nvalues; \
49 } \
50 \
51 static INLINE T* array_##TLOWER##_data(const Array##T* a) \
52 { \
53 WINPR_ASSERT(a); \
54 return a->values; \
55 } \
56 \
57 static INLINE const T* array_##TLOWER##_cdata(const Array##T* a) \
58 { \
59 WINPR_ASSERT(a); \
60 return (const T*)a->values; \
61 } \
62 \
63 static INLINE T array_##TLOWER##_get(const Array##T* a, size_t idx) \
64 { \
65 WINPR_ASSERT(a); \
66 WINPR_ASSERT(a->nvalues > idx); \
67 return a->values[idx]; \
68 } \
69 \
70 static INLINE void array_##TLOWER##_set(Array##T* a, size_t idx, T v) \
71 { \
72 WINPR_ASSERT(a); \
73 WINPR_ASSERT(a->nvalues > idx); \
74 a->values[idx] = v; \
75 } \
76 \
77 static INLINE BOOL array_##TLOWER##_append(Array##T* a, T v) \
78 { \
79 WINPR_ASSERT(a); \
80 T* tmp = realloc(a->values, sizeof(T) * (a->nvalues + 1)); \
81 if (!tmp) \
82 return FALSE; \
83 \
84 tmp[a->nvalues] = v; \
85 a->values = tmp; \
86 a->nvalues++; \
87 return TRUE; \
88 } \
89 \
90 static INLINE BOOL array_##TLOWER##_contains(const Array##T* a, T v) \
91 { \
92 WINPR_ASSERT(a); \
93 \
94 for (UINT32 i = 0; i < a->nvalues; i++) \
95 { \
96 if (memcmp(&a->values[i], &v, sizeof(T)) == 0) \
97 return TRUE; \
98 } \
99 \
100 return FALSE; \
101 } \
102 \
103 static INLINE BOOL array_##TLOWER##_foreach(Array##T* a, Array##T##Cb cb, void* data) \
104 { \
105 WINPR_ASSERT(a); \
106 for (size_t i = 0; i < a->nvalues; i++) \
107 { \
108 if (!cb(&a->values[i], data)) \
109 return FALSE; \
110 } \
111 \
112 return TRUE; \
113 } \
114 \
115 static INLINE void array_##TLOWER##_reset(Array##T* a) \
116 { \
117 WINPR_ASSERT(a); \
118 a->nvalues = 0; \
119 } \
120 \
121 static INLINE void array_##TLOWER##_uninit(Array##T* a) \
122 { \
123 WINPR_ASSERT(a); \
124 free(a->values); \
125 \
126 a->values = NULL; \
127 a->nvalues = 0; \
128 }
129
130 POD_ARRAYS_IMPL(UINT16, uint16)
131 POD_ARRAYS_IMPL(UINT32, uint32)
132 POD_ARRAYS_IMPL(UINT64, uint64)
133
134#ifdef __cplusplus
135}
136#endif
137
138#endif /* FREERDP_UTILS_POD_ARRAYS_H_ */