14c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include <android/utils/vector.h>
24c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include <limits.h>
34c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
44c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void
54c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner_avector_ensure( void**  items, size_t  itemSize, unsigned*  pMaxItems, unsigned  newCount )
64c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{
74c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    unsigned  oldMax = *pMaxItems;
84c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
94c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    if (newCount > oldMax) {
104c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned  newMax = oldMax;
114c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        unsigned  bigMax = UINT_MAX / itemSize;
124c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
134c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        if (itemSize == 0) {
144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            AASSERT_FAIL("trying to reallocate array of 0-size items (count=%d)\n", newCount);
154c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        }
164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        if (newCount > bigMax) {
184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            AASSERT_FAIL("trying to reallocate over-sized array of %d-bytes items (%d > %d)\n",
194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner                         itemSize, newCount, bigMax);
204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        }
214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        while (newMax < newCount) {
234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            unsigned newMax2 = newMax + (newMax >> 1) + 4;
244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            if (newMax2 < newMax || newMax2 > bigMax)
254c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner                newMax2 = bigMax;
264c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            newMax = newMax2;
274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        }
284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        *items     = _android_array_realloc( *items, itemSize, newMax );
304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        *pMaxItems = newMax;
314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    }
324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner}
334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
34