Skip to content

Commit 0f43179

Browse files
authored
Add OAG’s vector implementation (#15)
1 parent 10a9e5d commit 0f43179

File tree

3 files changed

+659
-0
lines changed

3 files changed

+659
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// realloc_vector.hpp
3+
// OpenRenderBoxCxx
4+
5+
#ifndef realloc_vector_hpp
6+
#define realloc_vector_hpp
7+
8+
#include <OpenRenderBox/ORBBase.h>
9+
10+
ORB_ASSUME_NONNULL_BEGIN
11+
12+
namespace ORB {
13+
namespace details {
14+
template <typename T = uint32_t, size_t Alignment>
15+
void *_Nullable realloc_vector(void* ptr, T& size, T new_size);
16+
17+
template <typename T = uint32_t, size_t Alignment>
18+
void *_Nullable realloc_vector(void* src, void* dst, T dstSize, T& size, T newSize);
19+
} /* details */
20+
} /* ORB */
21+
22+
ORB_ASSUME_NONNULL_END
23+
24+
#endif /* realloc_vector_hpp */
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
//
2+
// vector.hpp
3+
// OpenRenderBoxCxx
4+
//
5+
// Status: Complete
6+
// Modified based Compute code
7+
8+
#ifndef vector_hpp
9+
#define vector_hpp
10+
11+
#include <OpenRenderBox/ORBBase.h>
12+
#include <concepts>
13+
#include <iterator>
14+
#include <memory>
15+
16+
ORB_ASSUME_NONNULL_BEGIN
17+
18+
namespace ORB {
19+
20+
template <typename T, unsigned int _stack_size = 0, typename size_type = std::size_t>
21+
requires std::unsigned_integral<size_type>
22+
class vector {
23+
private:
24+
T _stack_buffer[_stack_size];
25+
T *_Nullable _buffer = nullptr;
26+
size_type _size = 0;
27+
size_type _capacity = _stack_size;
28+
29+
void reserve_slow(size_type new_cap);
30+
31+
public:
32+
using value_type = T;
33+
using reference = value_type &;
34+
using const_reference = const value_type &;
35+
using iterator = value_type *_Nonnull;
36+
using const_iterator = const value_type *_Nonnull;
37+
using reverse_iterator = std::reverse_iterator<iterator>;
38+
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
39+
40+
~vector();
41+
42+
// Element access
43+
44+
reference operator[](size_type pos) { return data()[pos]; };
45+
const_reference operator[](size_type pos) const { return data()[pos]; };
46+
47+
reference front() { return &data()[0]; };
48+
const_reference front() const { return *&data()[0]; };
49+
reference back() { return *&data()[_size - 1]; };
50+
const_reference back() const { return *&data()[_size - 1]; };
51+
52+
T *_Nonnull data() { return _buffer != nullptr ? _buffer : _stack_buffer; };
53+
const T *_Nonnull data() const { return _buffer != nullptr ? _buffer : _stack_buffer; };
54+
55+
// Iterators
56+
57+
iterator begin() { return iterator(&data()[0]); };
58+
const_iterator cbegin() const { return const_iterator(&data()[0]); };
59+
iterator end() { return iterator(&data()[_size]); };
60+
const_iterator cend() const { return const_iterator(&data()[_size]); };
61+
62+
reverse_iterator rbegin() { return std::reverse_iterator(end()); };
63+
const_reverse_iterator crbegin() const { return std::reverse_iterator(cend()); };
64+
reverse_iterator rend() { return std::reverse_iterator(begin()); };
65+
const_reverse_iterator crend() const { return std::reverse_iterator(cbegin()); };
66+
67+
// Capacity
68+
69+
bool empty() const { return _size == 0; };
70+
size_type size() const { return _size; };
71+
void reserve(size_type new_cap);
72+
size_type capacity() const { return _capacity; };
73+
void shrink_to_fit();
74+
75+
// Modifiers
76+
77+
void clear();
78+
79+
void push_back(const T &value);
80+
void push_back(T &&value);
81+
void pop_back();
82+
83+
void resize(size_type count);
84+
void resize(size_type count, const value_type &value);
85+
};
86+
87+
static_assert(std::contiguous_iterator<vector<int>::iterator>);
88+
static_assert(std::contiguous_iterator<vector<int>::const_iterator>);
89+
90+
// MARK: Specialization for empty stack buffer
91+
92+
template <typename T, typename size_type>
93+
requires std::unsigned_integral<size_type>
94+
class vector<T, 0, size_type> {
95+
private:
96+
T *_Nullable _buffer = nullptr;
97+
size_type _size = 0;
98+
size_type _capacity = 0;
99+
100+
void reserve_slow(size_type new_cap);
101+
102+
public:
103+
using value_type = T;
104+
using reference = value_type &;
105+
using const_reference = const value_type &;
106+
using iterator = value_type *_Nonnull;
107+
using const_iterator = const value_type *_Nonnull;
108+
using reverse_iterator = std::reverse_iterator<iterator>;
109+
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
110+
111+
~vector();
112+
113+
// Element access
114+
115+
reference operator[](size_type pos) { return data()[pos]; };
116+
const_reference operator[](size_type pos) const { return data()[pos]; };
117+
118+
reference front() { return &data()[0]; };
119+
const_reference front() const { return *&data()[0]; };
120+
reference back() { return *&data()[_size - 1]; };
121+
const_reference back() const { return *&data()[_size - 1]; };
122+
123+
T *_Nonnull data() { return _buffer; };
124+
const T *_Nonnull data() const { return _buffer; };
125+
126+
// Iterators
127+
128+
iterator begin() { return iterator(&data()[0]); };
129+
iterator end() { return iterator(&data()[_size]); };
130+
const_iterator cbegin() const { return const_iterator(&data()[0]); };
131+
const_iterator cend() const { return const_iterator(&data()[_size]); };
132+
const_iterator begin() const { return cbegin(); };
133+
const_iterator end() const { return cend(); };
134+
135+
reverse_iterator rbegin() { return std::reverse_iterator(end()); };
136+
reverse_iterator rend() { return std::reverse_iterator(begin()); };
137+
const_reverse_iterator crbegin() const { return std::reverse_iterator(cend()); };
138+
const_reverse_iterator crend() const { return std::reverse_iterator(cbegin()); };
139+
const_reverse_iterator rbegin() const { return crbegin(); };
140+
const_reverse_iterator rend() const { return crend(); };
141+
142+
// Capacity
143+
144+
bool empty() const { return _size == 0; };
145+
size_type size() const { return _size; };
146+
void reserve(size_type new_cap);
147+
size_type capacity() const { return _capacity; };
148+
void shrink_to_fit();
149+
150+
// Modifiers
151+
152+
void clear();
153+
154+
void push_back(const T &value);
155+
void push_back(T &&value);
156+
void pop_back();
157+
158+
void resize(size_type count);
159+
void resize(size_type count, const value_type &value);
160+
};
161+
162+
// MARK: Specialization for unique_ptr
163+
164+
template <typename T, typename size_type>
165+
requires std::unsigned_integral<size_type>
166+
class vector<std::unique_ptr<T>, 0, size_type> {
167+
private:
168+
std::unique_ptr<T> *_Nullable _buffer = nullptr;
169+
size_type _size = 0;
170+
size_type _capacity = 0;
171+
172+
void reserve_slow(size_type new_cap);
173+
174+
public:
175+
using value_type = std::unique_ptr<T>;
176+
using reference = value_type &;
177+
using const_reference = const value_type &;
178+
using iterator = value_type *_Nonnull;
179+
using const_iterator = const value_type *_Nonnull;
180+
using reverse_iterator = std::reverse_iterator<iterator>;
181+
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
182+
183+
~vector();
184+
185+
// Element access
186+
187+
reference operator[](size_type pos) { return data()[pos]; };
188+
const_reference operator[](size_type pos) const { return data()[pos]; };
189+
190+
reference front() { return &data()[0]; };
191+
const_reference front() const { return *&data()[0]; };
192+
reference back() { return *&data()[_size - 1]; };
193+
const_reference back() const { return *&data()[_size - 1]; };
194+
195+
std::unique_ptr<T> *_Nonnull data() { return _buffer; };
196+
const std::unique_ptr<T> *_Nonnull data() const { return _buffer; };
197+
198+
// Iterators
199+
200+
iterator begin() { return iterator(&data()[0]); };
201+
iterator end() { return iterator(&data()[_size]); };
202+
const_iterator cbegin() const { return const_iterator(&data()[0]); };
203+
const_iterator cend() const { return const_iterator(&data()[_size]); };
204+
const_iterator begin() const { return cbegin(); };
205+
const_iterator end() const { return cend(); };
206+
207+
reverse_iterator rbegin() { return std::reverse_iterator(end()); };
208+
reverse_iterator rend() { return std::reverse_iterator(begin()); };
209+
const_reverse_iterator crbegin() const { return std::reverse_iterator(cend()); };
210+
const_reverse_iterator crend() const { return std::reverse_iterator(cbegin()); };
211+
const_reverse_iterator rbegin() const { return crbegin(); };
212+
const_reverse_iterator rend() const { return crend(); };
213+
214+
// Capacity
215+
216+
bool empty() const { return _size == 0; };
217+
size_type size() const { return _size; };
218+
void reserve(size_type new_cap);
219+
size_type capacity() const { return _capacity; };
220+
void shrink_to_fit();
221+
222+
// Modifiers
223+
224+
void clear();
225+
226+
void push_back(const std::unique_ptr<T> &value) = delete;
227+
ORB_INLINE void push_back(std::unique_ptr<T> &&value);
228+
ORB_INLINE void pop_back();
229+
230+
void resize(size_type count);
231+
void resize(size_type count, const value_type &value);
232+
};
233+
234+
} /* ORB */
235+
236+
ORB_ASSUME_NONNULL_END
237+
238+
#include "vector.tpp"
239+
240+
#endif /* vector.hpp */

0 commit comments

Comments
 (0)