-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy patharray_list.h
99 lines (85 loc) · 2.24 KB
/
array_list.h
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#pragma once
#include "types.h"
#include "malloc.h"
#include "likely.h"
template<typename T, typename S = size_t>
class array_list
{
public:
array_list()
: items(nullptr)
, count(0)
, capacity(0)
{
}
array_list(array_list&& rhs) noexcept
: items(rhs.items)
, count(rhs.count)
, capacity(rhs.capacity)
{
rhs.items = nullptr;
rhs.count = 0;
rhs.capacity = 0;
}
~array_list();
using pointer = T*;
using const_pointer = T const*;
using reference = T&;
using const_reference = T const&;
using iterator = T*;
using const_iterator = T const*;
bool add(T &&item);
template<typename... Args>
bool add(Args&& ...args);
void clear();
void remove_at(S index);
_always_inline T &item(S index) { return items[index]; }
_always_inline T &operator[](S index) { return item(index); }
_always_inline T const& operator[](S index) const { return item(index); }
_always_inline T* begin() { return items; }
_always_inline T* end() { return items + count; }
_always_inline T const* begin() const { return items; }
_always_inline T const* end() const { return items + count; }
_always_inline T const* cbegin() const { return begin(); }
_always_inline T const* cend() const { return end(); }
private:
T *items;
S count;
S capacity;
};
template<typename T, typename S>
template<typename... Args>
bool array_list<T, S>::add(Args&& ...args)
{
return add(T(static_cast<Args&&>(args)...));
}
template<typename T, typename S>
array_list<T, S>::~array_list()
{
for (S i = 0; i < count; ++i)
items[i].~T();
free(items);
}
template<typename T, typename S>
bool array_list<T, S>::add(T&& item)
{
S new_capacity = capacity ? (capacity << 1) : 4;
T *new_items = malloc(sizeof(T) * new_capacity);
if (unlikely(!new_items))
return false;
for (S i = 0; i < count; ++i) {
new_items[i] = static_cast<T&&>(items[i]);
items[i].~T();
}
free(items);
items = new_items;
capacity = new_capacity;
return true;
}
template<typename T, typename S>
void array_list<T, S>::clear()
{
for (S i = 0; i < count; ++i)
items[i].~T();
count = 0;
}