sortarray.cpp revision 635c83753ed04cf3637e019af0e15ba40e07f2fe
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Sorted array impl
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Copyright (C) 2014 Oracle Corporation
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * available from http://www.virtualbox.org. This file is free software;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * General Public License (GPL) as published by the Free Software
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsyncVBOXSADECL(int) CrSaInit(CR_SORTARRAY *pArray, uint32_t cInitBuffer)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync pArray->pElements = (uint64_t*)RTMemAlloc(cInitBuffer * sizeof (pArray->pElements[0]));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* sanity */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaSearch(const CR_SORTARRAY *pArray, uint64_t element)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void crSaDbgValidate(const CR_SORTARRAY *pArray)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Assert(!pArray->pElements == !pArray->cBufferSize);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaInsAt(CR_SORTARRAY *pArray, uint32_t iPos, uint64_t element)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync uint32_t cNewBufferSize = pArray->cBufferSize + 16;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync pNew = (uint64_t*)RTMemRealloc(pArray->pElements, cNewBufferSize * sizeof (pArray->pElements[0]));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync pNew = (uint64_t*)RTMemAlloc(cNewBufferSize * sizeof (pArray->pElements[0]));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (int32_t i = (int32_t)pArray->cSize - 1; i >= (int32_t)iPos; --i)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void crSaDelAt(CR_SORTARRAY *pArray, uint32_t iPos)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (uint32_t i = iPos; i < pArray->cSize - 1; ++i)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaAdd(CR_SORTARRAY *pArray, uint64_t element)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaRemove(CR_SORTARRAY *pArray, uint64_t element)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (i >= 0)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * * @return true if element is found */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(bool) CrSaContains(const CR_SORTARRAY *pArray, uint64_t element)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(int) CrSaAdd(CR_SORTARRAY *pArray, uint64_t element)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(int) CrSaRemove(CR_SORTARRAY *pArray, uint64_t element)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaIntersected(const CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2, CR_SORTARRAY *pResult)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (uint32_t i = 0, j = 0; i < pArray1->cSize && j < pArray2->cSize; )
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pArray1->pElements[i] == pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (pArray1->pElements[i] < pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void crSaIntersect(CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (uint32_t i = 0, j = 0; i < pArray1->cSize && j < pArray2->cSize; )
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pArray1->pElements[i] == pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (pArray1->pElements[i] < pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @return >= 0 success
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * < 0 - no memory
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(void) CrSaIntersect(CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(int) CrSaIntersected(CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2, CR_SORTARRAY *pResult)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaUnited(const CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2, CR_SORTARRAY *pResult)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync uint32_t i = 0, j = 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pArray1->pElements[i] == pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (pArray1->pElements[i] < pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = crSaInsAt(pResult, cResult++, pTail->pElements[iTail]);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(int) CrSaUnited(const CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2, CR_SORTARRAY *pResult)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaClone(const CR_SORTARRAY *pArray1, CR_SORTARRAY *pResult)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync uint64_t *pNew = (uint64_t*)RTMemAlloc(cNewBufferSize * sizeof (pResult->pElements[0]));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync memcpy(pResult->pElements, pArray1->pElements, pArray1->cSize * sizeof (pArray1->pElements[0]));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @return VINF_SUCCESS on success
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VERR_NO_MEMORY - no memory
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(int) CrSaClone(const CR_SORTARRAY *pArray1, CR_SORTARRAY *pResult)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int crSaCmp(const CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int diff = CrSaGetSize(pArray1) - CrSaGetSize(pArray2);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return memcmp(pArray1->pElements, pArray2->pElements, pArray1->cSize * sizeof (pArray1->pElements[0]));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(int) CrSaCmp(const CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic bool crSaCovers(const CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync uint32_t i = 0, j = 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pArray1->pElements[i] == pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else if (pArray1->pElements[i] < pArray2->pElements[j])
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncVBOXSADECL(bool) CrSaCovers(const CR_SORTARRAY *pArray1, const CR_SORTARRAY *pArray2)