-
Notifications
You must be signed in to change notification settings - Fork 0
/
vector.hpp
156 lines (125 loc) · 5.01 KB
/
vector.hpp
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#pragma once
#include <new>
#include <nall/array-span.hpp>
#include <nall/array-view.hpp>
#include <nall/bit.hpp>
#include <nall/function.hpp>
#include <nall/iterator.hpp>
#include <nall/maybe.hpp>
#include <nall/memory.hpp>
#include <nall/merge-sort.hpp>
#include <nall/range.hpp>
#include <nall/traits.hpp>
#include <nall/view.hpp>
namespace nall {
template<typename T>
struct vector_base {
using type = vector_base;
//core.hpp
vector_base() = default;
vector_base(const initializer_list<T>& values);
vector_base(const type& source);
vector_base(type&& source);
~vector_base();
explicit operator bool() const;
operator array_span<T>();
operator array_view<T>() const;
template<typename Cast = T> auto capacity() const -> u64;
template<typename Cast = T> auto size() const -> u64;
template<typename Cast = T> auto data() -> Cast*;
template<typename Cast = T> auto data() const -> const Cast*;
//assign.hpp
auto operator=(const type& source) -> type&;
auto operator=(type&& source) -> type&;
//compare.hpp
auto operator==(const type& source) const -> bool;
auto operator!=(const type& source) const -> bool;
//memory.hpp
auto reset() -> void;
auto acquire(T* data, u64 size, u64 capacity = 0) -> void;
auto release() -> T*;
auto reserveLeft(u64 capacity) -> bool;
auto reserveRight(u64 capacity) -> bool;
auto reserve(u64 capacity) -> bool { return reserveRight(capacity); }
auto reallocateLeft(u64 size) -> bool;
auto reallocateRight(u64 size) -> bool;
auto reallocate(u64 size) -> bool { return reallocateRight(size); }
auto resizeLeft(u64 size, const T& value = T()) -> bool;
auto resizeRight(u64 size, const T& value = T()) -> bool;
auto resize(u64 size, const T& value = T()) -> bool { return resizeRight(size, value); }
//access.hpp
auto operator[](u64 offset) -> T&;
auto operator[](u64 offset) const -> const T&;
auto operator()(u64 offset) -> T&;
auto operator()(u64 offset, const T& value) const -> const T&;
auto left() -> T&;
auto first() -> T& { return left(); }
auto left() const -> const T&;
auto first() const -> const T& { return left(); }
auto right() -> T&;
auto last() -> T& { return right(); }
auto right() const -> const T&;
auto last() const -> const T& { return right(); }
//modify.hpp
auto prepend(const T& value) -> void;
auto prepend(T&& value) -> void;
auto prepend(const type& values) -> void;
auto prepend(type&& values) -> void;
auto append(const T& value) -> void;
auto append(T&& value) -> void;
auto append(const type& values) -> void;
auto append(type&& values) -> void;
auto insert(u64 offset, const T& value) -> void;
auto removeLeft(u64 length = 1) -> void;
auto removeFirst(u64 length = 1) -> void { return removeLeft(length); }
auto removeRight(u64 length = 1) -> void;
auto removeLast(u64 length = 1) -> void { return removeRight(length); }
auto remove(u64 offset, u64 length = 1) -> void;
auto removeByIndex(u64 offset) -> bool;
auto removeByValue(const T& value) -> bool;
auto takeLeft() -> T;
auto takeFirst() -> T { return move(takeLeft()); }
auto takeRight() -> T;
auto takeLast() -> T { return move(takeRight()); }
auto take(u64 offset) -> T;
//iterator.hpp
auto begin() -> iterator<T> { return {data(), 0}; }
auto end() -> iterator<T> { return {data(), size()}; }
auto begin() const -> iterator_const<T> { return {data(), 0}; }
auto end() const -> iterator_const<T> { return {data(), size()}; }
auto rbegin() -> reverse_iterator<T> { return {data(), size() - 1}; }
auto rend() -> reverse_iterator<T> { return {data(), (u64)-1}; }
auto rbegin() const -> reverse_iterator_const<T> { return {data(), size() - 1}; }
auto rend() const -> reverse_iterator_const<T> { return {data(), (u64)-1}; }
//utility.hpp
auto fill(const T& value = {}) -> void;
auto sort(const function<bool (const T& lhs, const T& rhs)>& comparator = [](auto& lhs, auto& rhs) { return lhs < rhs; }) -> void;
auto reverse() -> void;
auto find(const function<bool (const T& lhs)>& comparator) -> maybe<u64>;
auto find(const T& value) const -> maybe<u64>;
auto findSorted(const T& value) const -> maybe<u64>;
auto foreach(const function<void (const T&)>& callback) -> void;
auto foreach(const function<void (u64, const T&)>& callback) -> void;
protected:
T* _pool = nullptr; //pointer to first initialized element in pool
u64 _size = 0; //number of initialized elements in pool
u64 _left = 0; //number of allocated elements free on the left of pool
u64 _right = 0; //number of allocated elements free on the right of pool
};
}
#define vector vector_base
#include <nall/vector/core.hpp>
#include <nall/vector/assign.hpp>
#include <nall/vector/compare.hpp>
#include <nall/vector/memory.hpp>
#include <nall/vector/access.hpp>
#include <nall/vector/modify.hpp>
#include <nall/vector/iterator.hpp>
#include <nall/vector/utility.hpp>
#undef vector
namespace nall {
template<typename T> struct vector : vector_base<T> {
using vector_base<T>::vector_base;
};
}
#include <nall/vector/specialization/u8.hpp>