19#ifndef FREERDP_UTILS_POD_ARRAYS_H_
20#define FREERDP_UTILS_POD_ARRAYS_H_
22#include <winpr/wtypes.h>
23#include <winpr/assert.h>
30#define POD_ARRAYS_IMPL(T, TLOWER) \
36 typedef BOOL Array##T##Cb(T* v, void* data); \
38 static inline void array_##TLOWER##_init(Array##T* a) \
45 WINPR_ATTR_NODISCARD \
46 static inline size_t array_##TLOWER##_size(const Array##T* a) \
52 WINPR_ATTR_NODISCARD \
53 static inline T* array_##TLOWER##_data(const Array##T* a) \
59 WINPR_ATTR_NODISCARD \
60 static inline const T* array_##TLOWER##_cdata(const Array##T* a) \
63 return (const T*)a->values; \
66 WINPR_ATTR_NODISCARD \
67 static inline T array_##TLOWER##_get(const Array##T* a, size_t idx) \
70 WINPR_ASSERT(a->nvalues > idx); \
71 return a->values[idx]; \
74 static inline void array_##TLOWER##_set(Array##T* a, size_t idx, T v) \
77 WINPR_ASSERT(a->nvalues > idx); \
81 WINPR_ATTR_NODISCARD \
82 static inline BOOL array_##TLOWER##_append(Array##T* a, T v) \
85 T* tmp = realloc(a->values, sizeof(T) * (a->nvalues + 1)); \
89 tmp[a->nvalues] = v; \
95 WINPR_ATTR_NODISCARD \
96 static inline BOOL array_##TLOWER##_contains(const Array##T* a, T v) \
100 for (UINT32 i = 0; i < a->nvalues; i++) \
102 if (memcmp(&a->values[i], &v, sizeof(T)) == 0) \
109 WINPR_ATTR_NODISCARD \
110 static inline BOOL array_##TLOWER##_foreach(Array##T* a, Array##T##Cb cb, void* data) \
113 for (size_t i = 0; i < a->nvalues; i++) \
115 if (!cb(&a->values[i], data)) \
122 static inline void array_##TLOWER##_reset(Array##T* a) \
128 static inline void array_##TLOWER##_uninit(Array##T* a) \
137 POD_ARRAYS_IMPL(UINT16, uint16)
138 POD_ARRAYS_IMPL(UINT32, uint32)
139 POD_ARRAYS_IMPL(UINT64, uint64)