File DynArray.c

File List > core > DynArray.c

Go to the documentation of this file

#include "DynArray.h"
#include <string.h>
#include <stdlib.h> 



void* VectorInit(unsigned int itemSize)
{
    VectorData* data = (VectorData*)malloc(sizeof(VectorData) + itemSize);
    data->itemSize = itemSize;
    data->size = 0;
    data->capacity = 1;
    return data + 1;
}

void* VectorResize(void* vector, unsigned int size)
{
    VectorData* pData = ((VectorData*)vector) - 1;
    if (size <= pData->capacity)
    {
        return vector;
    }
    else if (size > pData->capacity)
    {
        VectorData* pNewAlloc = malloc(sizeof(VectorData) + pData->itemSize * size);
        if (pNewAlloc)
        {
            pNewAlloc->size = pData->size;
            pData->capacity = size;
            memcpy(pNewAlloc, pData, sizeof(VectorData) + pData->size * pData->itemSize);

            free(pData);
        }
        else
        {
            return NULL;
        }

        return pNewAlloc + 1;
    }
    return vector;
}

void* VectorPush(void* vector, void* item)
{
    VectorData* pData = ((VectorData*)vector) - 1;
    if (++pData->size > pData->capacity)
    {
        vector = VectorResize(vector, pData->capacity * 2);
        pData = ((VectorData*)vector) - 1;
    }
    void* topSpot = VectorTop(vector);
    memcpy(topSpot, item, pData->itemSize);
    return vector;
}

void* VectorPop(void* vector)
{
    VectorData* pData = ((VectorData*)vector) - 1;
    void* data = VectorTop(vector);
    pData->size--;
    return data;
}

void* VectorTop(void* vector)
{
    VectorData* pData = ((VectorData*)vector) - 1;
    return (char*)vector + ((pData->size - 1) * pData->itemSize);
}

void* VectorClear(void* vector)
{
    VectorData* pData = ((VectorData*)vector) - 1;
    pData->size = 0;
    return vector;
}

//unsigned int VectorSize(void* vector)
//{
//  VectorData* pData = ((VectorData*)vector) - 1;
//  return pData->size;
//}

void DestoryVector(void* vector)
{
    VectorData* pData = ((VectorData*)vector) - 1;
    free(pData);
}