+static inline PVOID ARRAY_AppendWorker(PARRAY Array, DWORD ItemSize, DWORD GrowWith)
+{
+ PBYTE pData;
+
+ if (!ARRAY_EnsureSize(Array, ItemSize, GrowWith))
+ return NULL;
+
+ pData = Array->Data__;
+ pData += (Array->Size__ * ItemSize);
+ Array->Size__++;
+
+ return pData;
+}
+
+static inline PVOID ARRAY_AtWorker(PARRAY Array, DWORD ItemSize, DWORD n)
+{
+ PBYTE pData;
+
+ ASSERT(Array);
+ ASSERT(ItemSize == Array->ItemSize__);
+ ASSERT(n < Array->Size__);
+
+ pData = Array->Data__;
+ return pData + (n * ItemSize);
+}
+
+
+#define ARRAY_Init(Array, TypeOfArray) ARRAY_InitWorker((Array), sizeof(TypeOfArray))
+#define ARRAY_Append(Array, TypeOfArray) (TypeOfArray*)ARRAY_AppendWorker((Array), sizeof(TypeOfArray), 5)
+#define ARRAY_At(Array, TypeOfArray, at) (TypeOfArray*)ARRAY_AtWorker((Array), sizeof(TypeOfArray), at)
+#define ARRAY_Size(Array) (Array)->Size__