CommonLibVR
Loading...
Searching...
No Matches
BSTArray.h
Go to the documentation of this file.
1#pragma once
2
4
5namespace RE
6{
7 class ScrapHeap;
8
10 {
11 public:
12 using size_type = std::uint32_t;
13
15 {
16 public:
17 inline static constexpr auto RTTI = RTTI_BSTArrayBase__IAllocatorFunctor;
18 inline static constexpr auto VTABLE = VTABLE_BSTArrayBase__IAllocatorFunctor;
19
20 // add
21 virtual bool Allocate(std::uint32_t a_num, std::uint32_t a_elemSize) = 0; // 00
22 virtual bool Reallocate(std::uint32_t a_minNewSizeInItems, std::uint32_t a_frontCopyCount, std::uint32_t a_shiftCount, std::uint32_t a_backCopyCount, std::uint32_t a_elemSize) = 0; // 01
23 virtual void Deallocate() = 0; // 02
24
25 virtual ~IAllocatorFunctor() = default; // 03
26
28 };
29 static_assert(sizeof(IAllocatorFunctor) == 0x8);
30
31 constexpr BSTArrayBase() noexcept = default;
32 constexpr BSTArrayBase(const BSTArrayBase&) noexcept = default;
33 constexpr BSTArrayBase(BSTArrayBase&&) noexcept = default;
34
35 inline ~BSTArrayBase() noexcept { _size = 0; }
36
37 BSTArrayBase& operator=(const BSTArrayBase&) noexcept = default;
38 BSTArrayBase& operator=(BSTArrayBase&&) noexcept = default;
39
40 [[nodiscard]] constexpr bool empty() const noexcept { return _size == 0; }
41 [[nodiscard]] constexpr size_type size() const noexcept { return _size; }
42
43 protected:
44 constexpr void set_size(size_type a_size) noexcept { _size = a_size; }
45
46 private:
47 // members
48 std::uint32_t _size{ 0 }; // 0
49 };
50 static_assert(sizeof(BSTArrayBase) == 0x4);
51
53 {
54 public:
55 using size_type = std::uint32_t;
56
57 constexpr BSTArrayHeapAllocator() noexcept = default;
58
60 {
61 if (a_rhs.data()) {
62 _capacity = a_rhs.capacity();
63 _data = allocate(capacity());
64 std::memcpy(data(), a_rhs.data(), capacity());
65 }
66 }
67
68 constexpr BSTArrayHeapAllocator(BSTArrayHeapAllocator&& a_rhs) noexcept :
69 _data(a_rhs.data()),
70 _capacity(a_rhs.capacity())
71 {
72 a_rhs._data = nullptr;
73 a_rhs._capacity = 0;
74 }
75
77 {
79 _data = nullptr;
80 _capacity = 0;
81 }
82
84 {
85 if (this != std::addressof(a_rhs)) {
87 _data = nullptr;
88 _capacity = 0;
89
90 if (a_rhs.data()) {
91 _capacity = a_rhs.capacity();
92 _data = allocate(capacity());
93 std::memcpy(data(), a_rhs.data(), capacity());
94 }
95 }
96 return *this;
97 }
98
100 {
101 if (this != std::addressof(a_rhs)) {
102 deallocate(data());
103 _data = a_rhs.data();
104 _capacity = a_rhs.capacity();
105
106 a_rhs._data = nullptr;
107 a_rhs._capacity = 0;
108 }
109 return *this;
110 }
111
113
114 [[nodiscard]] constexpr void* data() noexcept { return _data; }
115 [[nodiscard]] constexpr const void* data() const noexcept { return _data; }
116
117 [[nodiscard]] constexpr size_type capacity() const noexcept { return _capacity; }
118
119 protected:
120 inline void* allocate(std::size_t a_size)
121 {
122 const auto mem = malloc(a_size);
123 if (!mem) {
124 stl::report_and_fail("out of memory"sv);
125 } else {
126 std::memset(mem, 0, a_size);
127 return mem;
128 }
129 }
130
131 inline void deallocate(void* a_ptr) { free(a_ptr); }
132
133 constexpr void set_allocator_traits(void* a_data, std::uint32_t a_capacity, std::size_t) noexcept
134 {
135 _data = a_data;
136 _capacity = a_capacity;
137 }
138
139 private:
140 // members
141 void* _data{ nullptr }; // 00
142 std::uint32_t _capacity{ 0 }; // 08
143 };
144 static_assert(sizeof(BSTArrayHeapAllocator) == 0x10);
145
146 template <std::uint32_t N>
148 {
149 public:
150 using size_type = std::uint32_t;
151
152 constexpr BSTSmallArrayHeapAllocator() noexcept :
153 _capacity(0),
154 _local(1)
155 {}
156
158 _capacity(0),
159 _local(1)
160 {
161 copy(a_rhs);
162 }
163
165 _capacity(0),
166 _local(1)
167 {
168 copy(std::move(a_rhs));
169 }
170
171 inline ~BSTSmallArrayHeapAllocator() { release(); }
172
174 {
175 if (this != std::addressof(a_rhs)) {
176 copy(a_rhs);
177 }
178 return *this;
179 }
180
182 {
183 if (this != std::addressof(a_rhs)) {
184 copy(std::move(a_rhs));
185 }
186 return *this;
187 }
188
190
191 [[nodiscard]] constexpr void* data() noexcept { return local() ? _data.local : _data.heap; }
192 [[nodiscard]] constexpr const void* data() const noexcept { return local() ? _data.local : _data.heap; }
193
194 [[nodiscard]] constexpr size_type capacity() const noexcept { return _capacity; }
195
196 protected:
197 void* allocate(std::size_t a_size)
198 {
199 if (a_size > N) {
200 const auto mem = malloc(a_size);
201 if (!mem) {
202 stl::report_and_fail("out of memory"sv);
203 } else {
204 std::memset(mem, 0, a_size);
205 return mem;
206 }
207 } else {
208 return _data.local;
209 }
210 }
211
212 void deallocate(void* a_ptr)
213 {
214 if (a_ptr != _data.local) {
215 free(a_ptr);
216 }
217 }
218
219 constexpr void set_allocator_traits(void* a_data, std::uint32_t a_capacity, std::size_t a_typeSize) noexcept
220 {
221 _capacity = a_capacity;
222 if (a_capacity * a_typeSize > N) {
223 _local = 0;
224 _data.heap = a_data;
225 }
226 }
227
228 private:
229 union Data
230 {
231 void* heap;
232 char local[N]{ 0 };
233 };
234
235 inline void copy(const BSTSmallArrayHeapAllocator& a_rhs)
236 {
237 release();
238
239 _capacity = a_rhs._capacity;
240 _local = a_rhs._local;
241
242 if (!local()) {
243 const auto mem = malloc(capacity());
244 if (!mem) {
245 stl::report_and_fail("out of memory"sv);
246 } else {
247 _data.heap = mem;
248 }
249 }
250
251 std::memcpy(data(), a_rhs.data(), capacity());
252 }
253
254 inline void copy(BSTSmallArrayHeapAllocator&& a_rhs)
255 {
256 release();
257
258 _capacity = a_rhs._capacity;
259 _local = a_rhs._local;
260 std::memmove(data(), a_rhs.data(), capacity());
261
262 std::memset(a_rhs.data(), 0, a_rhs.capacity());
263 a_rhs._capacity = N;
264 a_rhs._local = 1;
265 }
266
267 [[nodiscard]] constexpr bool local() const noexcept { return _local != 0; }
268
269 inline void release()
270 {
271 if (!local()) {
272 free(_data.heap);
273 }
274
275 std::memset(data(), 0, capacity());
276 _capacity = N;
277 _local = 1;
278 }
279
280 // members
281 std::uint32_t _capacity: 31; // 00
282 std::uint32_t _local: 1; // 00
283 Data _data; // 08
284 };
285
287 {
288 public:
289 using size_type = std::uint32_t;
290
291 constexpr BSScrapArrayAllocator() noexcept = default;
292
294 _capacity(a_rhs._capacity)
295 {
296 if (capacity() > 0) {
297 _data = allocate(capacity());
298 std::memcpy(data(), a_rhs.data(), capacity());
299 }
300 }
301
302 constexpr BSScrapArrayAllocator(BSScrapArrayAllocator&& a_rhs) noexcept :
303 _allocator(a_rhs._allocator),
304 _data(a_rhs._data),
305 _capacity(a_rhs._capacity)
306 {
307 a_rhs._allocator = nullptr;
308 a_rhs._data = nullptr;
309 a_rhs._capacity = 0;
310 }
311
313
315 {
316 if (this != std::addressof(a_rhs)) {
317 if (_data) {
318 deallocate(_data);
319 _data = nullptr;
320 }
321
322 _capacity = a_rhs.capacity();
323 if (capacity() > 0) {
324 _data = allocate(capacity());
325 std::memcpy(data(), a_rhs.data(), capacity());
326 }
327 }
328 return *this;
329 }
330
332 {
333 if (this != std::addressof(a_rhs)) {
334 if (_data) {
335 deallocate(_data);
336 }
337
338 _allocator = a_rhs._allocator;
339 _data = a_rhs._data;
340 _capacity = a_rhs._capacity;
341
342 a_rhs._allocator = nullptr;
343 a_rhs._data = nullptr;
344 a_rhs._capacity = 0;
345 }
346 return *this;
347 }
348
350
351 [[nodiscard]] constexpr void* data() noexcept { return _data; }
352 [[nodiscard]] constexpr const void* data() const noexcept { return _data; }
353
354 [[nodiscard]] constexpr size_type capacity() const noexcept { return _capacity; }
355
356 protected:
357 void* allocate(std::size_t a_size);
358 void deallocate(void* a_ptr);
359
360 constexpr void set_allocator_traits(void* a_data, std::uint32_t a_capacity, std::size_t) noexcept
361 {
362 _data = a_data;
363 _capacity = a_capacity;
364 }
365
366 private:
367 // members
368 ScrapHeap* _allocator{ nullptr }; // 00
369 void* _data{ nullptr }; // 08
370 size_type _capacity{ 0 }; // 10
371 };
372 static_assert(sizeof(BSScrapArrayAllocator) == 0x18);
373
374 template <class T, class Allocator = BSTArrayHeapAllocator>
375 class BSTArray :
376 public Allocator,
377 public BSTArrayBase
378 {
379 public:
380 using allocator_type = Allocator;
382 using value_type = T;
384 using const_pointer = const value_type*;
389
390 BSTArray() = default;
391
392 inline BSTArray(const BSTArray& a_rhs)
393 {
394 const auto newCapacity = a_rhs.capacity();
395 if (newCapacity == 0) {
396 return;
397 }
398
399 const auto newSize = a_rhs.size();
400 const auto newData = allocate(newCapacity);
401 for (size_type i = 0; i < newSize; ++i) {
402 std::construct_at(newData + i, a_rhs[i]);
403 }
404
405 set_allocator_traits(newData, newCapacity);
406 set_size(newSize);
407 }
408
409 BSTArray(BSTArray&&) = default;
410
411 explicit inline BSTArray(size_type a_count)
412 {
413 if (a_count == 0) {
414 return;
415 }
416
417 const auto newCapacity = a_count;
418 const auto newSize = a_count;
419 const auto newData = allocate(newCapacity);
420 for (size_type i = 0; i < newSize; ++i) {
421 std::construct_at(newData + i);
422 }
423
424 set_allocator_traits(newData, newCapacity);
425 set_size(newSize);
426 }
427
428 inline ~BSTArray() { release(); }
429
430 inline BSTArray& operator=(const BSTArray& a_rhs)
431 {
432 if (this != std::addressof(a_rhs)) {
433 clear();
434
435 const auto newCapacity = a_rhs.capacity();
436 change_capacity(newCapacity);
437
438 const auto newSize = a_rhs.size();
439 set_size(newSize);
440
441 const auto newData = data();
442 for (size_type i = 0; i < newSize; ++i) {
443 std::construct_at(newData + i, a_rhs[i]);
444 }
445 }
446 return *this;
447 }
448
450 {
451 if (this != std::addressof(a_rhs)) {
452 release();
453
454 const auto newCapacity = a_rhs.capacity();
455 const auto newSize = a_rhs.size();
456 const auto newData = a_rhs.data();
457
458 set_allocator_traits(newData, newCapacity);
459 a_rhs.set_allocator_traits(0, 0);
460
461 set_size(newSize);
462 a_rhs.set_size(0);
463 }
464 return *this;
465 }
466
468
469 [[nodiscard]] constexpr reference operator[](size_type a_pos) noexcept
470 {
471 assert(a_pos < size());
472 return data()[a_pos];
473 }
474
475 [[nodiscard]] constexpr const_reference operator[](size_type a_pos) const noexcept
476 {
477 assert(a_pos < size());
478 return data()[a_pos];
479 }
480
481 [[nodiscard]] constexpr reference front() noexcept { return operator[](0); }
482 [[nodiscard]] constexpr const_reference front() const noexcept { return operator[](0); }
483
484 [[nodiscard]] constexpr reference back() noexcept { return operator[](size() - 1); }
485 [[nodiscard]] constexpr const_reference back() const noexcept { return operator[](size() - 1); }
486
487 [[nodiscard]] constexpr pointer data() noexcept { return static_cast<pointer>(allocator_type::data()); }
488 [[nodiscard]] constexpr const_pointer data() const noexcept { return static_cast<const_pointer>(allocator_type::data()); }
489
490 [[nodiscard]] constexpr iterator begin() noexcept { return empty() ? nullptr : data(); }
491 [[nodiscard]] constexpr const_iterator begin() const noexcept { return empty() ? nullptr : data(); }
492 [[nodiscard]] constexpr const_iterator cbegin() const noexcept { return begin(); }
493
494 [[nodiscard]] constexpr iterator end() noexcept { return empty() ? nullptr : data() + size(); }
495 [[nodiscard]] constexpr const_iterator end() const noexcept { return empty() ? nullptr : data() + size(); }
496 [[nodiscard]] constexpr const_iterator cend() const noexcept { return end(); }
497
498 [[nodiscard]] constexpr bool empty() const noexcept { return BSTArrayBase::empty(); }
499
500 [[nodiscard]] constexpr size_type size() const noexcept { return BSTArrayBase::size(); }
501
502 inline void reserve(size_type a_newCap)
503 {
504 if (a_newCap > capacity()) {
505 change_capacity(a_newCap);
506 }
507 }
508
509 [[nodiscard]] constexpr size_type capacity() const noexcept { return allocator_type::capacity(); }
510
511 inline void shrink_to_fit()
512 {
513 const auto newCapacity = size();
514 if (newCapacity != capacity()) {
515 change_capacity(newCapacity);
516 }
517 }
518
519 inline void clear()
520 {
521 if (!empty()) {
522 change_size(0);
523 }
524 }
525
527 {
528 auto pos = const_cast<iterator>(a_pos);
529 std::optional<iterator> result;
530 if (pos != begin()) {
531 result = pos - 1;
532 }
533
534 for (auto prev = pos++; pos != cend(); prev = pos++) {
535 *prev = std::move(*pos);
536 }
537 pop_back();
538
539 return result ? *result + 1 : begin();
540 }
541
542 inline void push_back(const value_type& a_value) { emplace_back(a_value); }
543 inline void push_back(value_type&& a_value) { emplace_back(std::move(a_value)); }
544
545 template <class... Args>
546 inline reference emplace_back(Args&&... a_args)
547 {
548 if (size() == capacity()) {
549 grow_capacity();
550 }
551
552 set_size(size() + 1);
553 auto& elem = back();
554 std::construct_at(std::addressof(elem), std::forward<Args>(a_args)...);
555 return elem;
556 }
557
558 inline void pop_back()
559 {
560 assert(!empty());
561 std::destroy_at(std::addressof(back()));
562 set_size(size() - 1);
563 }
564
565 inline void resize(size_type a_count)
566 {
567 if (a_count != size()) {
568 change_size(a_count);
569 }
570 }
571
572 inline void resize(size_type a_count, const value_type& a_value)
573 {
574 if (a_count != size()) {
575 change_size(a_count, a_value);
576 }
577 }
578
579 private:
580 static constexpr size_type DF_CAP = 4; // beth default
581 static constexpr float GROWTH_FACTOR = 2.0; // not part of native type
582
583 [[nodiscard]] inline pointer allocate(size_type a_num)
584 {
585 return static_cast<pointer>(allocator_type::allocate(a_num * sizeof(value_type)));
586 }
587
588 inline void deallocate(void* a_ptr) { allocator_type::deallocate(a_ptr); }
589
590 constexpr void set_allocator_traits(void* a_data, size_type a_capacity) noexcept
591 {
592 allocator_type::set_allocator_traits(a_data, a_capacity, sizeof(value_type));
593 }
594
595 constexpr void set_size(size_type a_size) noexcept { BSTArrayBase::set_size(a_size); }
596
597 inline void change_capacity(size_type a_newCapacity)
598 {
599 const auto newData = a_newCapacity > 0 ? allocate(a_newCapacity) : nullptr;
600 const auto oldData = data();
601 if (oldData) {
602 const auto oldCapacity = capacity();
603 if (newData) {
604 const auto bytesToCopy = std::min(oldCapacity, a_newCapacity) * sizeof(value_type);
605 std::memcpy(newData, oldData, bytesToCopy);
606 }
607 deallocate(oldData);
608 }
609 set_allocator_traits(newData, a_newCapacity);
610 }
611
612 template <class... Args>
613 inline void change_size(size_type a_newSize, Args&&... a_args)
614 {
615 if (a_newSize > capacity()) {
616 grow_capacity(a_newSize);
617 }
618
619 const auto oldSize = size();
620 if (a_newSize > oldSize) {
621 for (size_type i = oldSize; i < a_newSize; ++i) {
622 std::construct_at(data() + i, std::forward<Args>(a_args)...);
623 }
624 } else {
625 for (size_type i = a_newSize; i < oldSize; ++i) {
626 std::destroy_at(data() + i);
627 }
628 }
629
630 set_size(a_newSize);
631 }
632
633 inline void grow_capacity() { grow_capacity(capacity()); }
634
635 inline void grow_capacity(size_type a_hint)
636 {
637 auto cap = a_hint;
638 cap = cap > 0 ? static_cast<size_type>(std::ceil(static_cast<float>(cap) * GROWTH_FACTOR)) : DF_CAP;
639 change_capacity(cap);
640 }
641
642 inline void release()
643 {
644 clear();
645 change_capacity(0);
646 }
647 };
648
649 template <class T, std::uint32_t N = 1>
651
652 template <class T>
654
655 template <class T>
657 {
658 public:
659 using value_type = T;
660 using size_type = std::uint32_t;
662 using const_pointer = const value_type*;
667
668 [[nodiscard]] constexpr reference operator[](size_type a_pos) noexcept
669 {
670 assert(a_pos < _size);
671 return _data[a_pos];
672 }
673
674 [[nodiscard]] constexpr const_reference operator[](size_type a_pos) const noexcept
675 {
676 assert(a_pos < _size);
677 return _data[a_pos];
678 }
679
680 [[nodiscard]] constexpr reference front() noexcept { return operator[](0); }
681 [[nodiscard]] constexpr const_reference front() const noexcept { return operator[](0); }
682
683 [[nodiscard]] constexpr reference back() noexcept { return operator[](size() - 1); }
684 [[nodiscard]] constexpr const_reference back() const noexcept { return operator[](size() - 1); }
685
686 [[nodiscard]] constexpr pointer data() noexcept { return _data; }
687 [[nodiscard]] constexpr const_pointer data() const noexcept { return _data; }
688
689 [[nodiscard]] constexpr iterator begin() noexcept { return empty() ? nullptr : data(); }
690 [[nodiscard]] constexpr const_iterator begin() const noexcept { return empty() ? nullptr : data(); }
691 [[nodiscard]] constexpr const_iterator cbegin() const noexcept { return begin(); }
692
693 [[nodiscard]] constexpr iterator end() noexcept { return empty() ? nullptr : data() + size(); }
694 [[nodiscard]] constexpr const_iterator end() const noexcept { return empty() ? nullptr : data() + size(); }
695 [[nodiscard]] constexpr const_iterator cend() const noexcept { return end(); }
696
697 [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
698
699 [[nodiscard]] constexpr size_type size() const noexcept { return _size; }
700
701 private:
702 // members
703 pointer _data{ nullptr }; // 00
704 std::uint32_t _size{ 0 }; // 08
705 };
706
707 template <class T>
709 {
710 public:
711 using value_type = T;
712 using size_type = std::uint32_t;
714 using const_pointer = const value_type*;
719
720 [[nodiscard]] inline reference operator[](size_type a_pos) noexcept
721 {
722 assert(a_pos < _size);
723 return data()[a_pos];
724 }
725
726 [[nodiscard]] inline const_reference operator[](size_type a_pos) const noexcept
727 {
728 assert(a_pos < _size);
729 return data()[a_pos];
730 }
731
732 [[nodiscard]] inline pointer data() noexcept
733 {
734 return size() > 1 ? _data.heap : std::addressof(_data.local);
735 }
736
737 [[nodiscard]] inline const_pointer data() const noexcept
738 {
739 return size() > 1 ? _data.heap : std::addressof(_data.local);
740 }
741
742 [[nodiscard]] inline iterator begin() noexcept { return data(); }
743 [[nodiscard]] inline const_iterator begin() const noexcept { return data(); }
744 [[nodiscard]] inline const_iterator cbegin() const noexcept { return begin(); }
745
746 [[nodiscard]] inline iterator end() noexcept { return data() + size(); }
747 [[nodiscard]] inline const_iterator end() const noexcept { return data() + size(); }
748 [[nodiscard]] inline const_iterator cend() const noexcept { return end(); }
749
750 [[nodiscard]] constexpr bool empty() const noexcept { return size() != 0; }
751
752 [[nodiscard]] constexpr size_type size() const noexcept { return _size; }
753
754 private:
755 union Data
756 {
757 ~Data(){};
758
759 pointer heap{ 0 };
760 value_type local;
761 };
762
763 // members
764 std::uint32_t _size{ 0 }; // 00
765 Data _data; // 08
766 };
767}
Definition BSTArray.h:287
BSScrapArrayAllocator & operator=(const BSScrapArrayAllocator &a_rhs)
Definition BSTArray.h:314
constexpr BSScrapArrayAllocator() noexcept=default
constexpr const void * data() const noexcept
Definition BSTArray.h:352
constexpr void * data() noexcept
Definition BSTArray.h:351
constexpr size_type capacity() const noexcept
Definition BSTArray.h:354
constexpr BSScrapArrayAllocator(BSScrapArrayAllocator &&a_rhs) noexcept
Definition BSTArray.h:302
std::uint32_t size_type
Definition BSTArray.h:289
BSScrapArrayAllocator & operator=(BSScrapArrayAllocator &&a_rhs)
Definition BSTArray.h:331
void deallocate(void *a_ptr)
constexpr void set_allocator_traits(void *a_data, std::uint32_t a_capacity, std::size_t) noexcept
Definition BSTArray.h:360
void * allocate(std::size_t a_size)
Definition BSTArray.h:657
std::uint32_t size_type
Definition BSTArray.h:660
T value_type
Definition BSTArray.h:659
constexpr const_iterator begin() const noexcept
Definition BSTArray.h:690
const value_type * const_pointer
Definition BSTArray.h:662
constexpr const_iterator cbegin() const noexcept
Definition BSTArray.h:691
constexpr reference operator[](size_type a_pos) noexcept
Definition BSTArray.h:668
const value_type & const_reference
Definition BSTArray.h:664
constexpr const_reference operator[](size_type a_pos) const noexcept
Definition BSTArray.h:674
constexpr const_pointer data() const noexcept
Definition BSTArray.h:687
const_pointer const_iterator
Definition BSTArray.h:666
constexpr const_reference front() const noexcept
Definition BSTArray.h:681
constexpr const_reference back() const noexcept
Definition BSTArray.h:684
constexpr reference back() noexcept
Definition BSTArray.h:683
constexpr iterator begin() noexcept
Definition BSTArray.h:689
constexpr bool empty() const noexcept
Definition BSTArray.h:697
pointer iterator
Definition BSTArray.h:665
value_type & reference
Definition BSTArray.h:663
constexpr iterator end() noexcept
Definition BSTArray.h:693
constexpr const_iterator cend() const noexcept
Definition BSTArray.h:695
constexpr size_type size() const noexcept
Definition BSTArray.h:699
constexpr reference front() noexcept
Definition BSTArray.h:680
value_type * pointer
Definition BSTArray.h:661
constexpr pointer data() noexcept
Definition BSTArray.h:686
constexpr const_iterator end() const noexcept
Definition BSTArray.h:694
Definition BSTArray.h:15
virtual bool Allocate(std::uint32_t a_num, std::uint32_t a_elemSize)=0
static constexpr auto VTABLE
Definition BSTArray.h:18
virtual bool Reallocate(std::uint32_t a_minNewSizeInItems, std::uint32_t a_frontCopyCount, std::uint32_t a_shiftCount, std::uint32_t a_backCopyCount, std::uint32_t a_elemSize)=0
static constexpr auto RTTI
Definition BSTArray.h:17
Definition BSTArray.h:10
BSTArrayBase & operator=(BSTArrayBase &&) noexcept=default
constexpr size_type size() const noexcept
Definition BSTArray.h:41
constexpr void set_size(size_type a_size) noexcept
Definition BSTArray.h:44
constexpr bool empty() const noexcept
Definition BSTArray.h:40
constexpr BSTArrayBase() noexcept=default
BSTArrayBase & operator=(const BSTArrayBase &) noexcept=default
std::uint32_t size_type
Definition BSTArray.h:12
Definition BSTArray.h:53
void deallocate(void *a_ptr)
Definition BSTArray.h:131
std::uint32_t size_type
Definition BSTArray.h:55
constexpr void * data() noexcept
Definition BSTArray.h:114
BSTArrayHeapAllocator & operator=(BSTArrayHeapAllocator &&a_rhs)
Definition BSTArray.h:99
BSTArrayHeapAllocator & operator=(const BSTArrayHeapAllocator &a_rhs)
Definition BSTArray.h:83
constexpr const void * data() const noexcept
Definition BSTArray.h:115
void * allocate(std::size_t a_size)
Definition BSTArray.h:120
~BSTArrayHeapAllocator()
Definition BSTArray.h:76
constexpr BSTArrayHeapAllocator(BSTArrayHeapAllocator &&a_rhs) noexcept
Definition BSTArray.h:68
constexpr void set_allocator_traits(void *a_data, std::uint32_t a_capacity, std::size_t) noexcept
Definition BSTArray.h:133
constexpr size_type capacity() const noexcept
Definition BSTArray.h:117
constexpr BSTArrayHeapAllocator() noexcept=default
Definition BSTArray.h:378
value_type & reference
Definition BSTArray.h:385
const_pointer const_iterator
Definition BSTArray.h:388
void resize(size_type a_count, const value_type &a_value)
Definition BSTArray.h:572
void push_back(value_type &&a_value)
Definition BSTArray.h:543
void resize(size_type a_count)
Definition BSTArray.h:565
void pop_back()
Definition BSTArray.h:558
constexpr pointer data() noexcept
Definition BSTArray.h:487
iterator erase(const_iterator a_pos)
Definition BSTArray.h:526
constexpr size_type size() const noexcept
Definition BSTArray.h:500
constexpr reference back() noexcept
Definition BSTArray.h:484
constexpr const_iterator cbegin() const noexcept
Definition BSTArray.h:492
void clear()
Definition BSTArray.h:519
constexpr reference operator[](size_type a_pos) noexcept
Definition BSTArray.h:469
Allocator allocator_type
Definition BSTArray.h:380
constexpr const_reference operator[](size_type a_pos) const noexcept
Definition BSTArray.h:475
~BSTArray()
Definition BSTArray.h:428
reference emplace_back(Args &&... a_args)
Definition BSTArray.h:546
constexpr size_type capacity() const noexcept
Definition BSTArray.h:509
BSTArray()=default
T value_type
Definition BSTArray.h:382
constexpr const_reference back() const noexcept
Definition BSTArray.h:485
void reserve(size_type a_newCap)
Definition BSTArray.h:502
typename BSTArrayBase::size_type size_type
Definition BSTArray.h:381
void shrink_to_fit()
Definition BSTArray.h:511
const value_type & const_reference
Definition BSTArray.h:386
constexpr const_pointer data() const noexcept
Definition BSTArray.h:488
BSTArray(const BSTArray &a_rhs)
Definition BSTArray.h:392
constexpr iterator end() noexcept
Definition BSTArray.h:494
BSTArray & operator=(const BSTArray &a_rhs)
Definition BSTArray.h:430
constexpr reference front() noexcept
Definition BSTArray.h:481
BSTArray & operator=(BSTArray &&a_rhs)
Definition BSTArray.h:449
BSTArray(BSTArray &&)=default
const value_type * const_pointer
Definition BSTArray.h:384
void push_back(const value_type &a_value)
Definition BSTArray.h:542
BSTArray(size_type a_count)
Definition BSTArray.h:411
constexpr bool empty() const noexcept
Definition BSTArray.h:498
value_type * pointer
Definition BSTArray.h:383
constexpr const_iterator end() const noexcept
Definition BSTArray.h:495
constexpr const_iterator begin() const noexcept
Definition BSTArray.h:491
constexpr const_reference front() const noexcept
Definition BSTArray.h:482
constexpr const_iterator cend() const noexcept
Definition BSTArray.h:496
pointer iterator
Definition BSTArray.h:387
constexpr iterator begin() noexcept
Definition BSTArray.h:490
Definition BSTArray.h:148
constexpr BSTSmallArrayHeapAllocator() noexcept
Definition BSTArray.h:152
constexpr void set_allocator_traits(void *a_data, std::uint32_t a_capacity, std::size_t a_typeSize) noexcept
Definition BSTArray.h:219
constexpr void * data() noexcept
Definition BSTArray.h:191
BSTSmallArrayHeapAllocator(BSTSmallArrayHeapAllocator &&a_rhs)
Definition BSTArray.h:164
std::uint32_t size_type
Definition BSTArray.h:150
BSTSmallArrayHeapAllocator & operator=(BSTSmallArrayHeapAllocator &&a_rhs)
Definition BSTArray.h:181
BSTSmallArrayHeapAllocator & operator=(const BSTSmallArrayHeapAllocator &a_rhs)
Definition BSTArray.h:173
void * allocate(std::size_t a_size)
Definition BSTArray.h:197
~BSTSmallArrayHeapAllocator()
Definition BSTArray.h:171
void deallocate(void *a_ptr)
Definition BSTArray.h:212
BSTSmallArrayHeapAllocator(const BSTSmallArrayHeapAllocator &a_rhs)
Definition BSTArray.h:157
constexpr const void * data() const noexcept
Definition BSTArray.h:192
constexpr size_type capacity() const noexcept
Definition BSTArray.h:194
Definition BSTArray.h:709
const value_type & const_reference
Definition BSTArray.h:716
std::uint32_t size_type
Definition BSTArray.h:712
const value_type * const_pointer
Definition BSTArray.h:714
constexpr size_type size() const noexcept
Definition BSTArray.h:752
iterator begin() noexcept
Definition BSTArray.h:742
iterator end() noexcept
Definition BSTArray.h:746
T value_type
Definition BSTArray.h:711
const_iterator cbegin() const noexcept
Definition BSTArray.h:744
const_pointer const_iterator
Definition BSTArray.h:718
const_iterator begin() const noexcept
Definition BSTArray.h:743
constexpr bool empty() const noexcept
Definition BSTArray.h:750
reference operator[](size_type a_pos) noexcept
Definition BSTArray.h:720
pointer data() noexcept
Definition BSTArray.h:732
value_type & reference
Definition BSTArray.h:715
pointer iterator
Definition BSTArray.h:717
const_iterator end() const noexcept
Definition BSTArray.h:747
const_iterator cend() const noexcept
Definition BSTArray.h:748
value_type * pointer
Definition BSTArray.h:713
const_reference operator[](size_type a_pos) const noexcept
Definition BSTArray.h:726
const_pointer data() const noexcept
Definition BSTArray.h:737
Definition ScrapHeap.h:10
Definition AbsorbEffect.h:6
T * malloc()
Definition MemoryManager.h:113
constexpr std::array< REL::ID, 1 > VTABLE_BSTArrayBase__IAllocatorFunctor
Definition Offsets_VTABLE.h:9923
constexpr REL::ID RTTI_BSTArrayBase__IAllocatorFunctor(static_cast< std::uint64_t >(684604))
void free(void *a_ptr)
Definition MemoryManager.h:187
void report_and_fail(std::string_view a_msg, std::source_location a_loc=std::source_location::current())
Definition PCH.h:397