module bubel.ecs.simple_vector;

import bubel.ecs.std;

//import core.stdc.string;

/************************************************************************************************************************
Vector for byte data. Simpler than standard template-based implementation designed for better performance. \
Rellocates 1024 elements at once instead of doubling size.
*/
struct SimpleVector
{

    @disable this(this);

    ///Add element to vector
    void add(ubyte el) nothrow @nogc
    {
        while(used >= data.length)
        {
            if(data is null)data = Mallocator.makeArray!ubyte(1024);
            else data = Mallocator.expandArray(data,data.length);
        }
        data[used++] = el;
    }

    ///Add array of elements to vector
    void add(ubyte[] el) nothrow @nogc
    {
        while(used + el.length >= data.length)
        {
            if(data is null)data = Mallocator.makeArray!ubyte(1024);
            else data = Mallocator.expandArray(data,data.length);
        }
        memcpy(data.ptr + used, el.ptr, el.length);
        used += el.length;
    }

    ///Return vector length
    size_t length() nothrow @nogc
    {
        return used;
    }

    export ref ubyte opIndex(size_t pos) nothrow @nogc
    {
		return data[pos];
	}

	export ubyte[] opSlice() nothrow @nogc
    {
		return data[0 .. used];
	}

	export ubyte[] opSlice(size_t x, size_t y) nothrow @nogc
    {
		return data[x .. y];
	}

	export size_t opDollar() nothrow @nogc
    {
		return used;
	}

    ///set vector length to 0
    void clear() nothrow @nogc
    {
        used = 0;
    }

    ubyte[] data = null;
    size_t used = 0;
}