FreeRDP
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
26 extern "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_ */