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