aboutsummaryrefslogtreecommitdiff
path: root/archived/array.h
blob: 04d2f3891c147701ebd94533d7c6c172fda1761b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "chatty.h"

u64 ArrayLength(u8 *Array);
void ArrayInsert(u8 *Array, u64 Position, u8 Element);
void ArrayCopy(u8 *To, u8 *From);
void ArrayDelete(u8* Array, u64 Position);
u8* ArrayCreate(u8* Container, u64 Capacity);

// EXAMPLE: CREATE
//
//  u64 Capacity = 15;
//  u8 ArrayContainer[Capacity + sizeof(Capacity)];
//  u8* Array = ArrayCreate(ArrayContainer, Capacity);
//
// EXAMPLE: API
//
//  ArrayCopy(Array, (u8*)"Hello, world!");
//
//  ArrayInsert(Array, 3, 'f');
//  ArrayInsert(Array, 3, 'e');
//  Array[14] = 'd';
//  ArrayDelete(Array, 3);

#ifdef ARRAY_IMPL

#include <strings.h>
#include <string.h>

u64
ArrayLength(u8 *Array)
{
    return *((u64*)(Array - sizeof(u64)));
}

void
ArrayInsert(u8 *Array, u64 Position, u8 Element)
{
    memmove(Array + Position + 1, Array + Position, ArrayLength(Array) - Position - 1);
    Array[Position] = Element;
}

// Copy null terminated string without copying over the null terminator
void
ArrayCopy(u8 *To, u8 *From)
{
    u32 i = 0;
    while (From[i])
    {
        To[i] = From[i];
        i++;
    }
}

void
ArrayDelete(u8* Array, u64 Position)
{
    memmove(Array + Position, Array + Position + 1, ArrayLength(Array) - Position - 1);
    Array[ArrayLength(Array) - 1] = 0;
}

u8*
ArrayCreate(u8* Container, u64 Capacity)
{
    *(u64*)Container = Capacity;
    u8 *Array = Container + sizeof(Capacity);
    bzero(Array, Capacity);
    return Array;
}

#endif