xref: /aosp_15_r20/external/deqp/framework/delibs/depool/dePoolArray.h (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _DEPOOLARRAY_H
2*35238bceSAndroid Build Coastguard Worker #define _DEPOOLARRAY_H
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Memory Pool Library
5*35238bceSAndroid Build Coastguard Worker  * --------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief Memory pool array class.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "deDefs.h"
27*35238bceSAndroid Build Coastguard Worker #include "deMemPool.h"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker enum
30*35238bceSAndroid Build Coastguard Worker {
31*35238bceSAndroid Build Coastguard Worker     DE_ARRAY_ELEMENTS_PER_PAGE_LOG2 = 4 /*!< \internal 16 */
32*35238bceSAndroid Build Coastguard Worker };
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
35*35238bceSAndroid Build Coastguard Worker  * \internal
36*35238bceSAndroid Build Coastguard Worker  * \brief Type-independent version of the array template class.
37*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
38*35238bceSAndroid Build Coastguard Worker typedef struct dePoolArray_s
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker     deMemPool *pool; /*!< Pool from which all memory is allocated from.    */
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker     int elementSize; /*!< Size of the element (in bytes).                */
43*35238bceSAndroid Build Coastguard Worker     int numElements; /*!< Number of elements in the array.                */
44*35238bceSAndroid Build Coastguard Worker     int capacity;    /*!< Number of allocated elements in the array.        */
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker     int pageTableCapacity; /*!< Size of the page table.                        */
47*35238bceSAndroid Build Coastguard Worker     void **pageTable;      /*!< Pointer to the page table.                        */
48*35238bceSAndroid Build Coastguard Worker } dePoolArray;
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker DE_BEGIN_EXTERN_C
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker dePoolArray *dePoolArray_create(deMemPool *pool, int elementSize);
53*35238bceSAndroid Build Coastguard Worker bool dePoolArray_reserve(dePoolArray *arr, int capacity);
54*35238bceSAndroid Build Coastguard Worker bool dePoolArray_setSize(dePoolArray *arr, int size);
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker void dePoolArray_selfTest(void);
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker DE_END_EXTERN_C
59*35238bceSAndroid Build Coastguard Worker 
60*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
61*35238bceSAndroid Build Coastguard Worker  * \brief Declare a template pool array class.
62*35238bceSAndroid Build Coastguard Worker  * \param TYPENAME    Type name of the declared array.
63*35238bceSAndroid Build Coastguard Worker  * \param VALUETYPE    Type of the value contained in the array.
64*35238bceSAndroid Build Coastguard Worker  *
65*35238bceSAndroid Build Coastguard Worker  * This macro declares a pool array with all the necessary functions for
66*35238bceSAndroid Build Coastguard Worker  * operating with it. All allocated memory is taken from the memory pool
67*35238bceSAndroid Build Coastguard Worker  * given to the constructor.
68*35238bceSAndroid Build Coastguard Worker  *
69*35238bceSAndroid Build Coastguard Worker  * The array is implemented by having a set of pages (which store the
70*35238bceSAndroid Build Coastguard Worker  * elements) and a page table with pointers to each of them. The pages
71*35238bceSAndroid Build Coastguard Worker  * are allocated individually whenever they are needed, but the page
72*35238bceSAndroid Build Coastguard Worker  * table grows exponentially. This keeps the memory overhead for large
73*35238bceSAndroid Build Coastguard Worker  * arrays very small. On the other hand, the relative overhead for very
74*35238bceSAndroid Build Coastguard Worker  * small arrays is prohibitive (the minimum allocation is 16 elements).
75*35238bceSAndroid Build Coastguard Worker  *
76*35238bceSAndroid Build Coastguard Worker  * The functions for operating the array are:
77*35238bceSAndroid Build Coastguard Worker  * \todo [petri] Figure out how to comment these in Doxygen-style.
78*35238bceSAndroid Build Coastguard Worker  *
79*35238bceSAndroid Build Coastguard Worker  * \code
80*35238bceSAndroid Build Coastguard Worker  * Array*   Array_create            (deMemPool* pool);
81*35238bceSAndroid Build Coastguard Worker  * int      Array_getNumElements    (const Array* array);
82*35238bceSAndroid Build Coastguard Worker  * bool   Array_reserve           (Array* array, int size);
83*35238bceSAndroid Build Coastguard Worker  * bool   Array_setSize           (Array* array, int size);
84*35238bceSAndroid Build Coastguard Worker  * void        Array_reset                (Array* array);
85*35238bceSAndroid Build Coastguard Worker  * Element  Array_get               (Array* array, int ndx);
86*35238bceSAndroid Build Coastguard Worker  * bool   Array_set               (Array* array, int ndx, Element elem);
87*35238bceSAndroid Build Coastguard Worker  * bool   Array_pushBack          (Array* array, Element elem);
88*35238bceSAndroid Build Coastguard Worker  * Element  Array_popBack           (Array* array);
89*35238bceSAndroid Build Coastguard Worker  * void     Array_swap              (Array* array, int aNdx, int bNdx);
90*35238bceSAndroid Build Coastguard Worker  * \endcode
91*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
92*35238bceSAndroid Build Coastguard Worker #define DE_DECLARE_POOL_ARRAY(TYPENAME, VALUETYPE)                                                               \
93*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
94*35238bceSAndroid Build Coastguard Worker     typedef struct TYPENAME##_s                                                                                  \
95*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
96*35238bceSAndroid Build Coastguard Worker         deMemPool *pool;                                                                                         \
97*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
98*35238bceSAndroid Build Coastguard Worker         int elementSize;                                                                                         \
99*35238bceSAndroid Build Coastguard Worker         int numElements;                                                                                         \
100*35238bceSAndroid Build Coastguard Worker         int capacity;                                                                                            \
101*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
102*35238bceSAndroid Build Coastguard Worker         int pageTableCapacity;                                                                                   \
103*35238bceSAndroid Build Coastguard Worker         DE_PTR_TYPE(VALUETYPE) * pageTable;                                                                      \
104*35238bceSAndroid Build Coastguard Worker     } TYPENAME; /* NOLINT(TYPENAME) */                                                                           \
105*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
106*35238bceSAndroid Build Coastguard Worker     DE_INLINE TYPENAME *TYPENAME##_create(deMemPool *pool);                                                      \
107*35238bceSAndroid Build Coastguard Worker     DE_INLINE int TYPENAME##_getNumElements(const TYPENAME *arr) DE_UNUSED_FUNCTION;                             \
108*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_reserve(DE_PTR_TYPE(TYPENAME) arr, int capacity) DE_UNUSED_FUNCTION;               \
109*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_setSize(DE_PTR_TYPE(TYPENAME) arr, int size) DE_UNUSED_FUNCTION;                   \
110*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_reset(DE_PTR_TYPE(TYPENAME) arr) DE_UNUSED_FUNCTION;                               \
111*35238bceSAndroid Build Coastguard Worker     DE_INLINE VALUETYPE TYPENAME##_get(const TYPENAME *arr, int ndx) DE_UNUSED_FUNCTION;                         \
112*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_set(DE_PTR_TYPE(TYPENAME) arr, int ndx, VALUETYPE elem) DE_UNUSED_FUNCTION;        \
113*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_pushBack(DE_PTR_TYPE(TYPENAME) arr, VALUETYPE elem) DE_UNUSED_FUNCTION;            \
114*35238bceSAndroid Build Coastguard Worker     DE_INLINE VALUETYPE TYPENAME##_popBack(DE_PTR_TYPE(TYPENAME) arr) DE_UNUSED_FUNCTION;                        \
115*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_copy(DE_PTR_TYPE(TYPENAME) dst, const TYPENAME *src) DE_UNUSED_FUNCTION;           \
116*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_swap(DE_PTR_TYPE(TYPENAME) arr, int aNdx, int bNdx) DE_UNUSED_FUNCTION;            \
117*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
118*35238bceSAndroid Build Coastguard Worker     DE_INLINE TYPENAME *TYPENAME##_create(deMemPool *pool)                                                       \
119*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
120*35238bceSAndroid Build Coastguard Worker         return (TYPENAME *)dePoolArray_create(pool, sizeof(VALUETYPE));                                          \
121*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
122*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
123*35238bceSAndroid Build Coastguard Worker     DE_INLINE int TYPENAME##_getNumElements(const TYPENAME *arr)                                                 \
124*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
125*35238bceSAndroid Build Coastguard Worker         return arr->numElements;                                                                                 \
126*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
127*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
128*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_reserve(DE_PTR_TYPE(TYPENAME) arr, int capacity)                                   \
129*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
130*35238bceSAndroid Build Coastguard Worker         if (capacity > arr->capacity)                                                                            \
131*35238bceSAndroid Build Coastguard Worker             return dePoolArray_reserve((dePoolArray *)arr, capacity);                                            \
132*35238bceSAndroid Build Coastguard Worker         return true;                                                                                             \
133*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
134*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
135*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_setSize(DE_PTR_TYPE(TYPENAME) arr, int size)                                       \
136*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
137*35238bceSAndroid Build Coastguard Worker         if (size > arr->capacity)                                                                                \
138*35238bceSAndroid Build Coastguard Worker             return dePoolArray_setSize((dePoolArray *)arr, size);                                                \
139*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
140*35238bceSAndroid Build Coastguard Worker         arr->numElements = size;                                                                                 \
141*35238bceSAndroid Build Coastguard Worker         return true;                                                                                             \
142*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
143*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
144*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_reset(DE_PTR_TYPE(TYPENAME) arr)                                                   \
145*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
146*35238bceSAndroid Build Coastguard Worker         arr->numElements = 0;                                                                                    \
147*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
148*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
149*35238bceSAndroid Build Coastguard Worker     DE_INLINE VALUETYPE TYPENAME##_get(const TYPENAME *arr, int ndx)                                             \
150*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
151*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(ndx >= 0 && ndx < arr->numElements);                                                           \
152*35238bceSAndroid Build Coastguard Worker         {                                                                                                        \
153*35238bceSAndroid Build Coastguard Worker             int pageNdx = (ndx >> DE_ARRAY_ELEMENTS_PER_PAGE_LOG2);                                              \
154*35238bceSAndroid Build Coastguard Worker             int subNdx  = ndx & ((1 << DE_ARRAY_ELEMENTS_PER_PAGE_LOG2) - 1);                                    \
155*35238bceSAndroid Build Coastguard Worker             return ((VALUETYPE *)arr->pageTable[pageNdx])[subNdx];                                               \
156*35238bceSAndroid Build Coastguard Worker         }                                                                                                        \
157*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
158*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
159*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_set(DE_PTR_TYPE(TYPENAME) arr, int ndx, VALUETYPE elem)                            \
160*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
161*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(ndx >= 0 && ndx < arr->numElements);                                                           \
162*35238bceSAndroid Build Coastguard Worker         {                                                                                                        \
163*35238bceSAndroid Build Coastguard Worker             int pageNdx                                    = (ndx >> DE_ARRAY_ELEMENTS_PER_PAGE_LOG2);           \
164*35238bceSAndroid Build Coastguard Worker             int subNdx                                     = ndx & ((1 << DE_ARRAY_ELEMENTS_PER_PAGE_LOG2) - 1); \
165*35238bceSAndroid Build Coastguard Worker             ((VALUETYPE *)arr->pageTable[pageNdx])[subNdx] = elem;                                               \
166*35238bceSAndroid Build Coastguard Worker         }                                                                                                        \
167*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
168*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
169*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_pushBack(DE_PTR_TYPE(TYPENAME) arr, VALUETYPE elem)                                \
170*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
171*35238bceSAndroid Build Coastguard Worker         if ((arr->numElements + 1 >= arr->capacity) && !TYPENAME##_reserve(arr, arr->numElements + 1))           \
172*35238bceSAndroid Build Coastguard Worker             return false;                                                                                        \
173*35238bceSAndroid Build Coastguard Worker         arr->numElements++;                                                                                      \
174*35238bceSAndroid Build Coastguard Worker         TYPENAME##_set(arr, arr->numElements - 1, elem);                                                         \
175*35238bceSAndroid Build Coastguard Worker         return true;                                                                                             \
176*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
177*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
178*35238bceSAndroid Build Coastguard Worker     DE_INLINE VALUETYPE TYPENAME##_popBack(DE_PTR_TYPE(TYPENAME) arr)                                            \
179*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
180*35238bceSAndroid Build Coastguard Worker         int ndx     = arr->numElements - 1;                                                                      \
181*35238bceSAndroid Build Coastguard Worker         int pageNdx = (ndx >> DE_ARRAY_ELEMENTS_PER_PAGE_LOG2);                                                  \
182*35238bceSAndroid Build Coastguard Worker         int subNdx  = ndx & ((1 << DE_ARRAY_ELEMENTS_PER_PAGE_LOG2) - 1);                                        \
183*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(arr->numElements > 0);                                                                         \
184*35238bceSAndroid Build Coastguard Worker         arr->numElements--;                                                                                      \
185*35238bceSAndroid Build Coastguard Worker         /* \note We access a value which is out-of-bounds, but we know it to be safe. */                         \
186*35238bceSAndroid Build Coastguard Worker         return ((VALUETYPE *)arr->pageTable[pageNdx])[subNdx];                                                   \
187*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
188*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
189*35238bceSAndroid Build Coastguard Worker     DE_INLINE bool TYPENAME##_copy(DE_PTR_TYPE(TYPENAME) dst, const TYPENAME *src)                               \
190*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
191*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(dst &&src);                                                                                    \
192*35238bceSAndroid Build Coastguard Worker         {                                                                                                        \
193*35238bceSAndroid Build Coastguard Worker             int numElements = src->numElements;                                                                  \
194*35238bceSAndroid Build Coastguard Worker             int ndx;                                                                                             \
195*35238bceSAndroid Build Coastguard Worker             if (!TYPENAME##_setSize(dst, numElements))                                                           \
196*35238bceSAndroid Build Coastguard Worker                 return false;                                                                                    \
197*35238bceSAndroid Build Coastguard Worker             for (ndx = 0; ndx < numElements; ndx++)                                                              \
198*35238bceSAndroid Build Coastguard Worker                 TYPENAME##_set(dst, ndx, TYPENAME##_get(src, ndx));                                              \
199*35238bceSAndroid Build Coastguard Worker         }                                                                                                        \
200*35238bceSAndroid Build Coastguard Worker         return true;                                                                                             \
201*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
202*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
203*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_swap(DE_PTR_TYPE(TYPENAME) arr, int aNdx, int bNdx)                                \
204*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
205*35238bceSAndroid Build Coastguard Worker         VALUETYPE tmp = TYPENAME##_get(arr, aNdx);                                                               \
206*35238bceSAndroid Build Coastguard Worker         TYPENAME##_set(arr, aNdx, TYPENAME##_get(arr, bNdx));                                                    \
207*35238bceSAndroid Build Coastguard Worker         TYPENAME##_set(arr, bNdx, tmp);                                                                          \
208*35238bceSAndroid Build Coastguard Worker     }                                                                                                            \
209*35238bceSAndroid Build Coastguard Worker                                                                                                                  \
210*35238bceSAndroid Build Coastguard Worker     struct TYPENAME##Unused_s                                                                                    \
211*35238bceSAndroid Build Coastguard Worker     {                                                                                                            \
212*35238bceSAndroid Build Coastguard Worker         int unused;                                                                                              \
213*35238bceSAndroid Build Coastguard Worker     }
214*35238bceSAndroid Build Coastguard Worker 
215*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
216*35238bceSAndroid Build Coastguard Worker  * \brief Declare a sort function for an array.
217*35238bceSAndroid Build Coastguard Worker  * \param TYPENAME    Type name of the declared array.
218*35238bceSAndroid Build Coastguard Worker  * \param VALUETYPE    Type of the value contained in the array.
219*35238bceSAndroid Build Coastguard Worker  * \param SORTNAME    Name for this specific sort.
220*35238bceSAndroid Build Coastguard Worker  * \param CMPFUNC    Comparison function for sorting.
221*35238bceSAndroid Build Coastguard Worker  *
222*35238bceSAndroid Build Coastguard Worker  * This macro declares a sort function for an array declared using
223*35238bceSAndroid Build Coastguard Worker  * DE_DECLARE_POOL_ARRAY macro.
224*35238bceSAndroid Build Coastguard Worker  *
225*35238bceSAndroid Build Coastguard Worker  * Sorting algorithm is heap sort since it requires constant amount of
226*35238bceSAndroid Build Coastguard Worker  * auxiliary space and is in-place sort. Worst-case run-time is O(n log n)
227*35238bceSAndroid Build Coastguard Worker  * and sort is NOT stable.
228*35238bceSAndroid Build Coastguard Worker  *
229*35238bceSAndroid Build Coastguard Worker  * CMPFUNC is used to compare elements in array. It must accept two
230*35238bceSAndroid Build Coastguard Worker  * parameters and return negative integer if first is smaller than, 0 if
231*35238bceSAndroid Build Coastguard Worker  * both are equal and positive integer if first is larger than second.
232*35238bceSAndroid Build Coastguard Worker  *
233*35238bceSAndroid Build Coastguard Worker  * The functions for sorting array are:
234*35238bceSAndroid Build Coastguard Worker  * \todo [petri] Figure out how to comment these in Doxygen-style.
235*35238bceSAndroid Build Coastguard Worker  *
236*35238bceSAndroid Build Coastguard Worker  * \code
237*35238bceSAndroid Build Coastguard Worker  * void        Array_sortName            (Array* array);
238*35238bceSAndroid Build Coastguard Worker  * void        Array_sortNameHeapify    (Array* array);
239*35238bceSAndroid Build Coastguard Worker  * void        Array_sortNameShiftDown    (Array* array, int start, int end);
240*35238bceSAndroid Build Coastguard Worker  * \endcode
241*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
242*35238bceSAndroid Build Coastguard Worker #define DE_DECLARE_POOL_ARRAY_SORT(TYPENAME, VALUETYPE, SORTNAME, CMPFUNC)                               \
243*35238bceSAndroid Build Coastguard Worker                                                                                                          \
244*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_##SORTNAME##ShiftDown(DE_PTR_TYPE(TYPENAME) arr, int startNdx, int endNdx) \
245*35238bceSAndroid Build Coastguard Worker     {                                                                                                    \
246*35238bceSAndroid Build Coastguard Worker         int rootNdx = startNdx;                                                                          \
247*35238bceSAndroid Build Coastguard Worker                                                                                                          \
248*35238bceSAndroid Build Coastguard Worker         while (rootNdx * 2 + 1 <= endNdx)                                                                \
249*35238bceSAndroid Build Coastguard Worker         {                                                                                                \
250*35238bceSAndroid Build Coastguard Worker             int childNdx = rootNdx * 2 + 1;                                                              \
251*35238bceSAndroid Build Coastguard Worker                                                                                                          \
252*35238bceSAndroid Build Coastguard Worker             if ((childNdx + 1 <= endNdx) &&                                                              \
253*35238bceSAndroid Build Coastguard Worker                 (CMPFUNC(TYPENAME##_get(arr, childNdx), TYPENAME##_get(arr, childNdx + 1)) < 0))         \
254*35238bceSAndroid Build Coastguard Worker                 childNdx += 1;                                                                           \
255*35238bceSAndroid Build Coastguard Worker                                                                                                          \
256*35238bceSAndroid Build Coastguard Worker             if (CMPFUNC(TYPENAME##_get(arr, rootNdx), TYPENAME##_get(arr, childNdx)) < 0)                \
257*35238bceSAndroid Build Coastguard Worker             {                                                                                            \
258*35238bceSAndroid Build Coastguard Worker                 TYPENAME##_swap(arr, rootNdx, childNdx);                                                 \
259*35238bceSAndroid Build Coastguard Worker                 rootNdx = childNdx;                                                                      \
260*35238bceSAndroid Build Coastguard Worker             }                                                                                            \
261*35238bceSAndroid Build Coastguard Worker             else                                                                                         \
262*35238bceSAndroid Build Coastguard Worker                 break;                                                                                   \
263*35238bceSAndroid Build Coastguard Worker         }                                                                                                \
264*35238bceSAndroid Build Coastguard Worker     }                                                                                                    \
265*35238bceSAndroid Build Coastguard Worker                                                                                                          \
266*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_##SORTNAME##Heapify(DE_PTR_TYPE(TYPENAME) arr)                             \
267*35238bceSAndroid Build Coastguard Worker     {                                                                                                    \
268*35238bceSAndroid Build Coastguard Worker         int startNdx = (TYPENAME##_getNumElements(arr) - 2) / 2;                                         \
269*35238bceSAndroid Build Coastguard Worker                                                                                                          \
270*35238bceSAndroid Build Coastguard Worker         while (startNdx >= 0)                                                                            \
271*35238bceSAndroid Build Coastguard Worker         {                                                                                                \
272*35238bceSAndroid Build Coastguard Worker             TYPENAME##_##SORTNAME##ShiftDown(arr, startNdx, TYPENAME##_getNumElements(arr) - 1);         \
273*35238bceSAndroid Build Coastguard Worker             startNdx -= 1;                                                                               \
274*35238bceSAndroid Build Coastguard Worker         }                                                                                                \
275*35238bceSAndroid Build Coastguard Worker     }                                                                                                    \
276*35238bceSAndroid Build Coastguard Worker                                                                                                          \
277*35238bceSAndroid Build Coastguard Worker     DE_INLINE void TYPENAME##_##SORTNAME(DE_PTR_TYPE(TYPENAME) arr)                                      \
278*35238bceSAndroid Build Coastguard Worker     {                                                                                                    \
279*35238bceSAndroid Build Coastguard Worker         int endNdx = TYPENAME##_getNumElements(arr) - 1;                                                 \
280*35238bceSAndroid Build Coastguard Worker                                                                                                          \
281*35238bceSAndroid Build Coastguard Worker         TYPENAME##_##SORTNAME##Heapify(arr);                                                             \
282*35238bceSAndroid Build Coastguard Worker                                                                                                          \
283*35238bceSAndroid Build Coastguard Worker         while (endNdx > 0)                                                                               \
284*35238bceSAndroid Build Coastguard Worker         {                                                                                                \
285*35238bceSAndroid Build Coastguard Worker             TYPENAME##_swap(arr, endNdx, 0);                                                             \
286*35238bceSAndroid Build Coastguard Worker             endNdx -= 1;                                                                                 \
287*35238bceSAndroid Build Coastguard Worker             TYPENAME##_##SORTNAME##ShiftDown(arr, 0, endNdx);                                            \
288*35238bceSAndroid Build Coastguard Worker         }                                                                                                \
289*35238bceSAndroid Build Coastguard Worker     }                                                                                                    \
290*35238bceSAndroid Build Coastguard Worker                                                                                                          \
291*35238bceSAndroid Build Coastguard Worker     struct TYPENAME##SORTNAME##unused_s                                                                  \
292*35238bceSAndroid Build Coastguard Worker     {                                                                                                    \
293*35238bceSAndroid Build Coastguard Worker         int unused;                                                                                      \
294*35238bceSAndroid Build Coastguard Worker     }
295*35238bceSAndroid Build Coastguard Worker 
296*35238bceSAndroid Build Coastguard Worker /* Basic array types. */
297*35238bceSAndroid Build Coastguard Worker 
298*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_ARRAY(deIntArray, int);
299*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_ARRAY(deInt8Array, int8_t);
300*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_ARRAY(deUint8Array, uint8_t);
301*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_ARRAY(deInt16Array, int16_t);
302*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_ARRAY(deUint16Array, uint16_t);
303*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_ARRAY(deInt32Array, int32_t);
304*35238bceSAndroid Build Coastguard Worker DE_DECLARE_POOL_ARRAY(deUint32Array, uint32_t);
305*35238bceSAndroid Build Coastguard Worker 
306*35238bceSAndroid Build Coastguard Worker #endif /* _DEPOOLARRAY_H */
307