Ocean
Loading...
Searching...
No Matches
StackHeapVector.h
Go to the documentation of this file.
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8#ifndef META_OCEAN_BASE_STACK_HEAP_VECTOR_H
9#define META_OCEAN_BASE_STACK_HEAP_VECTOR_H
10
11#include "ocean/base/Base.h"
13
14namespace Ocean
15{
16
17/**
18 * Vector like data structure combining stack and heap memory.
19 * This class implements a vector-like data structure which stores the first `tStackCapacity` elements on the stack, and any additional elements on the heap.<br>
20 * This approach can optimize performance and memory usage when the number of elements is often within the `tStackCapacity` but can occasionally exceed it.
21 * @tparam T Data type of the elements that will be stored
22 * @tparam tStackCapacity Number of elements that can be stored on the stack, with range [1, infinity)
23 * @ingroup base
24 */
25template <typename T, size_t tStackCapacity>
27{
28 static_assert(tStackCapacity >= 1, "Invalid stack capacity!");
29
30 public:
31
32 /**
33 * Definition of an iterator allowing to iterate through the vector.
34 * The iterator allows to modified the element to which the iterator is pointing.
35 */
37 {
38 friend class StackHeapVector;
39
40 public:
41
42 /**
43 * (Pre-) increments this iterator.
44 * @return Reference to the incremented iterator
45 */
46 Iterator& operator++();
47
48 /**
49 * (Post-) increments this iterator.
50 * @return The current (not yet) incremented iterator.
51 */
52 Iterator operator++(int);
53
54 /**
55 * De-references the iterator and provides access to the underlying element in the vector.
56 * @return The vector element to which this iterator points
57 */
59
60 /**
61 * Compares two iterators and returns whether both iterators point to the same vector element.
62 * @return True, if so
63 */
64 bool operator==(const Iterator& iterator) const;
65
66 /**
67 * Compares two iterators and returns whether both iterators do not point to the same vector element.
68 * @return True, if so
69 */
70 bool operator!=(const Iterator& iterator) const;
71
72 protected:
73
74 /**
75 * Creates a new iterator pointing to a specified elements in the vector.
76 * @param vector The vector owning this iterator
77 * @param index The index of the element to which the iterator points
78 */
79 Iterator(StackHeapVector& vector, const size_t index);
80
81 protected:
82
83 /// The vector owning this iterator.
85
86 /// The index of the element within the vector to which the iterator points.
87 size_t index_ = size_t(-1);
88 };
89
90 /**
91 * Definition of an iterator allowing to iterate through the vector.
92 * The iterator does ont allow to modified the element to which the iterator is pointing.
93 */
95 {
96 friend class StackHeapVector;
97
98 public:
99
100 /**
101 * (Pre-) increments this iterator.
102 * @return Reference to the incremented iterator
103 */
104 ConstIterator& operator++();
105
106 /**
107 * (Post-) increments this iterator.
108 * @return The current (not yet) incremented iterator.
109 */
110 ConstIterator operator++(int);
111
112 /**
113 * De-references the iterator and provides access to the underlying element in the vector.
114 * @return The vector element to which this iterator points
115 */
116 const T& operator*() const;
117
118 /**
119 * Compares two iterators and returns whether both iterators point to the same vector element.
120 * @return True, if so
121 */
122 bool operator==(const ConstIterator& iterator) const;
123
124 /**
125 * Compares two iterators and returns whether both iterators do not point to the same vector element.
126 * @return True, if so
127 */
128 bool operator!=(const ConstIterator& iterator) const;
129
130 protected:
131
132 /**
133 * Creates a new iterator pointing to a specified elements in the vector.
134 * @param vector The vector owning this iterator
135 * @param index The index of the element to which the iterator points
136 */
137 ConstIterator(const StackHeapVector& vector, const size_t index);
138
139 protected:
140
141 /// The vector owning this iterator.
143
144 /// The index of the element within the vector to which the iterator points.
145 size_t index_ = size_t(-1);
146 };
147
148 public:
149
150 /**
151 * Creates a new vector object.
152 */
154
155 /**
156 * Creates a new vector object.
157 * @param size The number of default elements to be created
158 */
159 explicit StackHeapVector(const size_t size);
160
161 /**
162 * Creates a new vector object.
163 * @param size The number of elements to be created
164 * @param element The value that will be created in the first 'number' elements of this vector
165 */
166 StackHeapVector(const size_t size, const T& element);
167
168 /**
169 * Creates a new vector object and moves the elements to this vector.
170 * @param elements The elements to be moved
171 */
172 StackHeapVector(std::vector<T>&& elements);
173
174 /**
175 * Creates a new vector object and copies the elements to this vector.
176 * @param elements The elements to be copied
177 */
178 StackHeapVector(const std::vector<T>& elements);
179
180 /**
181 * Creates a new vector object and copies the elements to this vector.
182 * @param elements The elements to be copied
183 */
184 StackHeapVector(const std::initializer_list<T> elements);
185
186 /**
187 * Move constructor.
188 * @param other The other vector to move
189 */
191
192 /**
193 * Copy constructor.
194 * @param other The other vector to copy
195 */
197
198 /**
199 * Pushes a new element to the end of this vector.
200 * @param element The new element to be pushed
201 */
202 void pushBack(T&& element);
203
204 /**
205 * Pushes a new element to the end of this vector.
206 * @param element The new element to be pushed
207 */
208 void pushBack(const T& element);
209
210 /**
211 * Emplaces a new element to the end of this vector.
212 * @param args The arguments of the new element
213 * @tparam TArgs The data types of the arguments
214 */
215 template <typename... TArgs>
216 T& emplaceBack(TArgs&&... args);
217
218 /**
219 * Removed the last elements from the vector.
220 * The vector must not be empty.
221 */
222 void popBack();
223
224 /**
225 * Resizes the vector.
226 * @param size The new size of the vector
227 */
228 void resize(const size_t size);
229
230 /**
231 * Replaces the content of the vector with 'size' copies of the provided element.
232 * @param size The new size of the vector, with range [0, infinity)
233 * @param element The element which will be copied into all places of the resized vector
234 */
235 void assign(const size_t size, const T& element);
236
237 /**
238 * Returns the number of elements of this vector.
239 * @return The vector's number of elements, with range [0, infinity)
240 */
241 inline size_t size() const;
242
243 /**
244 * Returns the overall capacity of this vector (including the capacity on the stack and on the heap).
245 * @return The vector's capacity, with range [size(), infinity)
246 */
247 inline size_t capacity() const;
248
249 /**
250 * Returns whether this vector is empty.
251 * @return True, if so
252 */
253 inline bool isEmpty() const;
254
255 /**
256 * Clears this vector.
257 * All stack elements will be overwritten with default values.
258 */
259 void clear();
260
261 /**
262 * Reserves a specified capacity for this vector.
263 * In case the specified capacity is smaller than the current capacity or is smaller than the number of elements in this vector, nothing happens.
264 * @param capacity The capacity to reserve, with range [0, infinity)
265 */
266 void reserve(const size_t capacity);
267
268 /**
269 * Returns the first element of this vector.
270 * Ensure that the vector is not empty before calling this function.
271 * @return The vector's first element
272 */
273 const T& front() const;
274
275 /**
276 * Returns the first element of this vector.
277 * Ensure that the vector is not empty before calling this function.
278 * @return The vector's first element
279 */
280 T& front();
281
282 /**
283 * Returns the last element of this vector.
284 * Ensure that the vector is not empty before calling this function.
285 * @return The vector's last element
286 */
287 const T& back() const;
288
289 /**
290 * Returns the last element of this vector.
291 * Ensure that the vector is not empty before calling this function.
292 * @return The vector's last element
293 */
294 T& back();
295
296 /**
297 * Returns an iterator to the first element in this vector.
298 * @return The vector's iterator to the first element
299 */
300 Iterator begin();
301
302 /**
303 * Returns an iterator to the element following the last element in this vector.
304 * @return The vector's iterator to the element following the last element
305 */
306 Iterator end();
307
308 /**
309 * Returns a const iterator to the first element in this vector.
310 * @return The vector's iterator to the first element
311 */
312 ConstIterator begin() const;
313
314 /**
315 * Returns an iterator to the element following the last element in this vector.
316 * @return The vector's iterator to the element following the last element
317 */
318 ConstIterator end() const;
319
320 /**
321 * Elements access operator.
322 * @param index The index of the element to access, with range [0, size() - 1]
323 * @return The element with specified index
324 */
325 inline const T& operator[](const size_t index) const;
326
327 /**
328 * Elements access operator.
329 * @param index The index of the element to access, with range [0, size() - 1]
330 * @return The element with specified index
331 */
332 inline T& operator[](const size_t index);
333
334 /**
335 * Compares two vectors for equality.
336 * @param other The other vector to compare with
337 * @return True if both vectors have the same size and all elements are equal
338 */
340
341 /**
342 * Move assignment operator.
343 * @param other The other vector to move
344 * @return Reference to this vector
345 */
347
348 /**
349 * Copy assignment operator.
350 * @param other The other vector to copy
351 * @return Reference to this vector
352 */
354
355 protected:
356
357 /// The elements located on the stack.
358 T stackElements_[tStackCapacity];
359
360 /// The remaining elements located on the heap.
361 std::vector<T> heapElements_;
362
363 /// The number of elements in this vector.
364 size_t size_ = 0;
365};
366
367template <typename T, size_t tStackCapacity>
369 vector_(vector),
370 index_(index)
371{
372 ocean_assert(index <= vector_.size_);
373}
374
375template <typename T, size_t tStackCapacity>
382
383template <typename T, size_t tStackCapacity>
385{
386 Iterator iterator(*this);
387
388 ++index_;
389
390 return iterator;
391}
392
393template <typename T, size_t tStackCapacity>
395{
396 return vector_[index_];
397}
398
399template <typename T, size_t tStackCapacity>
401{
402 ocean_assert(&vector_ == &iterator.vector_);
403
404 return &vector_ == &iterator.vector_ && index_ == iterator.index_;
405}
406
407template <typename T, size_t tStackCapacity>
409{
410 return !(*this == iterator);
411}
412
413template <typename T, size_t tStackCapacity>
415 vector_(vector),
416 index_(index)
417{
418 ocean_assert(index <= vector_.size_);
419}
420
421template <typename T, size_t tStackCapacity>
428
429template <typename T, size_t tStackCapacity>
431{
432 ConstIterator iterator(*this);
433
434 ++index_;
435
436 return iterator;
437}
438
439template <typename T, size_t tStackCapacity>
441{
442 return vector_[index_];
443}
444
445template <typename T, size_t tStackCapacity>
447{
448 ocean_assert(&vector_ == &iterator.vector_);
449
450 return &vector_ == &iterator.vector_ && index_ == iterator.index_;
451}
452
453template <typename T, size_t tStackCapacity>
455{
456 return !(*this == iterator);
457}
458
459template <typename T, size_t tStackCapacity>
461{
462 // nothing to do here
463}
464
465template <typename T, size_t tStackCapacity>
470
471template <typename T, size_t tStackCapacity>
473{
474 reserve(size);
475
476 for (size_t n = 0; n < size; ++n)
477 {
478 pushBack(element);
479 }
480}
481
482template <typename T, size_t tStackCapacity>
484{
485 reserve(elements.size());
486
487 for (T& element : elements)
488 {
489 pushBack(std::move(element));
490 }
491}
492
493template <typename T, size_t tStackCapacity>
495{
496 reserve(elements.size());
497
498 for (const T& element : elements)
499 {
500 pushBack(element);
501 }
502}
503
504template <typename T, size_t tStackCapacity>
505StackHeapVector<T, tStackCapacity>::StackHeapVector(const std::initializer_list<T> elements)
506{
507 reserve(elements.size());
508
509 for (const T& element : elements)
510 {
511 pushBack(element);
512 }
513}
514
515template <typename T, size_t tStackCapacity>
517 heapElements_(std::move(other.heapElements_)),
518 size_(other.size_)
519{
520 for (size_t n = 0; n < std::min(size_, tStackCapacity); ++n)
521 {
522 stackElements_[n] = std::move(other.stackElements_[n]);
523 }
524
525 other.size_ = 0;
526}
527
528template <typename T, size_t tStackCapacity>
530{
531 reserve(other.size());
532
533 for (size_t n = 0; n < other.size(); ++n)
534 {
535 pushBack(other[n]);
536 }
537}
538
539template <typename T, size_t tStackCapacity>
541{
542 if (size_ < tStackCapacity)
543 {
544 stackElements_[size_] = std::move(element);
545 }
546 else
547 {
548 heapElements_.emplace_back(std::move(element));
549 }
550
551 ++size_;
552}
553
554template <typename T, size_t tStackCapacity>
556{
557 if (size_ < tStackCapacity)
558 {
559 stackElements_[size_] = element;
560 }
561 else
562 {
563 heapElements_.push_back(element);
564 }
565
566 ++size_;
567}
568
569template <typename T, size_t tStackCapacity>
570template <typename... TArgs>
572{
573 const size_t index = size_;
574
575 ++size_;
576
577 if (index < tStackCapacity)
578 {
579 stackElements_[index] = T(std::forward<TArgs>(args)...);
580
581 return stackElements_[index];
582 }
583 else
584 {
585 return heapElements_.emplace_back(std::forward<TArgs>(args)...);
586 }
587}
588
589template <typename T, size_t tStackCapacity>
591{
592 ocean_assert(size_ >= 1);
593
594 --size_;
595
596 if (size_ >= tStackCapacity)
597 {
598 heapElements_.pop_back();
599 }
600 else
601 {
602 stackElements_[size_] = T();
603 }
604}
605
606template <typename T, size_t tStackCapacity>
608{
609 if (size == size_)
610 {
611 return;
612 }
613
614 if (size < size_)
615 {
616 // we have to remove elements
617
618 for (size_t n = size; n < std::min(size_, tStackCapacity); ++n) // in case size >= tStackCapacity, nothing happens
619 {
620 stackElements_[n] = T();
621 }
622
623 if (size_ > tStackCapacity)
624 {
625 if (size < tStackCapacity)
626 {
627 heapElements_.clear();
628 }
629 else
630 {
631 heapElements_.resize(size - tStackCapacity);
632 }
633 }
634 }
635 else
636 {
637 ocean_assert(size > size_);
638
639 for (size_t n = size_; n < std::min(size, tStackCapacity); ++n)
640 {
641 stackElements_[n] = T();
642 }
643
644 if (size > tStackCapacity)
645 {
646 heapElements_.resize(size - tStackCapacity);
647 }
648 }
649
650 size_ = size;
651}
652
653template <typename T, size_t tStackCapacity>
654void StackHeapVector<T, tStackCapacity>::assign(const size_t size, const T& element)
655{
656 for (size_t n = 0; n < std::min(size, tStackCapacity); ++n) // we assign as many elements as we have in the stack
657 {
658 stackElements_[n] = element;
659 }
660
661 for (size_t n = size; n < std::min(tStackCapacity, size_); ++n) // if necessary (if the new size is smaller than the previous size), we overwrite stack elements with default values
662 {
663 stackElements_[n] = T();
664 }
665
666 if (size < tStackCapacity)
667 {
668 heapElements_.clear();
669 }
670 else
671 {
672 const size_t newHeapSize = size - tStackCapacity;
673
674 heapElements_.assign(newHeapSize, element);
675 }
676
677 size_ = size;
678}
679
680template <typename T, size_t tStackCapacity>
682{
683 ocean_assert(size_ <= tStackCapacity || size_ == tStackCapacity + heapElements_.size());
684
685 return size_;
686}
687
688template <typename T, size_t tStackCapacity>
690{
691 return tStackCapacity + heapElements_.capacity();
692}
693
694template <typename T, size_t tStackCapacity>
696{
697 return size() == 0;
698}
699
700template <typename T, size_t tStackCapacity>
702{
703 for (size_t nStack = 0; nStack < std::min(size_, tStackCapacity); ++nStack)
704 {
705 stackElements_[nStack] = T();
706 }
707
708 heapElements_.clear();
709
710 size_ = 0;
711}
712
713template <typename T, size_t tStackCapacity>
715{
716 if (capacity > this->capacity())
717 {
718 if (capacity > tStackCapacity)
719 {
720 heapElements_.reserve(capacity - tStackCapacity);
721 }
722 }
723}
724
725template <typename T, size_t tStackCapacity>
727{
728 ocean_assert(!isEmpty());
729
730 return stackElements_[0];
731}
732
733template <typename T, size_t tStackCapacity>
735{
736 ocean_assert(!isEmpty());
737
738 return stackElements_[0];
739}
740
741template <typename T, size_t tStackCapacity>
743{
744 ocean_assert(!isEmpty());
745
746 if (size_ <= tStackCapacity)
747 {
748 return stackElements_[size_ - 1];
749 }
750 else
751 {
752 return heapElements_.back();
753 }
754}
755
756template <typename T, size_t tStackCapacity>
758{
759 ocean_assert(!isEmpty());
760
761 if (size_ <= tStackCapacity)
762 {
763 return stackElements_[size_ - 1];
764 }
765 else
766 {
767 return heapElements_.back();
768 }
769}
770
771template <typename T, size_t tStackCapacity>
776
777template <typename T, size_t tStackCapacity>
782
783template <typename T, size_t tStackCapacity>
788
789template <typename T, size_t tStackCapacity>
794
795template <typename T, size_t tStackCapacity>
796inline const T& StackHeapVector<T, tStackCapacity>::operator[](const size_t index) const
797{
798 ocean_assert(index < size());
799
800 if (index < tStackCapacity)
801 {
802 return stackElements_[index];
803 }
804
805 return heapElements_[index - tStackCapacity];
806}
807
808template <typename T, size_t tStackCapacity>
810{
811 ocean_assert(index < size());
812
813 if (index < tStackCapacity)
814 {
815 return stackElements_[index];
816 }
817
818 return heapElements_[index - tStackCapacity];
819}
820
821template <typename T, size_t tStackCapacity>
823{
824 if (size_ != other.size_)
825 {
826 return false;
827 }
828
829 for (size_t n = 0; n < size_; ++n)
830 {
831 if ((*this)[n] != other[n])
832 {
833 return false;
834 }
835 }
836
837 return true;
838}
839
840template <typename T, size_t tStackCapacity>
842{
843 if (this != &other)
844 {
845 heapElements_ = std::move(other.heapElements_);
846 size_ = other.size_;
847
848 for (size_t n = 0; n < std::min(size_, tStackCapacity); ++n)
849 {
850 stackElements_[n] = std::move(other.stackElements_[n]);
851 }
852
853 for (size_t n = size_; n < tStackCapacity; ++n)
854 {
855 stackElements_[n] = T();
856 }
857
858 other.size_ = 0;
859 }
860
861 return *this;
862}
863
864template <typename T, size_t tStackCapacity>
866{
867 if (this != &other)
868 {
869 clear();
870 reserve(other.size());
871
872 for (size_t n = 0; n < other.size(); ++n)
873 {
874 pushBack(other[n]);
875 }
876 }
877
878 return *this;
879}
880
881}
882
883#endif // META_OCEAN_BASE_STACK_HEAP_VECTOR_H
Definition of an iterator allowing to iterate through the vector.
Definition StackHeapVector.h:95
const StackHeapVector & vector_
The vector owning this iterator.
Definition StackHeapVector.h:142
ConstIterator(const StackHeapVector &vector, const size_t index)
Creates a new iterator pointing to a specified elements in the vector.
Definition StackHeapVector.h:414
bool operator==(const ConstIterator &iterator) const
Compares two iterators and returns whether both iterators point to the same vector element.
Definition StackHeapVector.h:446
size_t index_
The index of the element within the vector to which the iterator points.
Definition StackHeapVector.h:145
bool operator!=(const ConstIterator &iterator) const
Compares two iterators and returns whether both iterators do not point to the same vector element.
Definition StackHeapVector.h:454
const T & operator*() const
De-references the iterator and provides access to the underlying element in the vector.
Definition StackHeapVector.h:440
ConstIterator & operator++()
(Pre-) increments this iterator.
Definition StackHeapVector.h:422
Definition of an iterator allowing to iterate through the vector.
Definition StackHeapVector.h:37
size_t index_
The index of the element within the vector to which the iterator points.
Definition StackHeapVector.h:87
bool operator==(const Iterator &iterator) const
Compares two iterators and returns whether both iterators point to the same vector element.
Definition StackHeapVector.h:400
bool operator!=(const Iterator &iterator) const
Compares two iterators and returns whether both iterators do not point to the same vector element.
Definition StackHeapVector.h:408
Iterator(StackHeapVector &vector, const size_t index)
Creates a new iterator pointing to a specified elements in the vector.
Definition StackHeapVector.h:368
StackHeapVector & vector_
The vector owning this iterator.
Definition StackHeapVector.h:84
T & operator*()
De-references the iterator and provides access to the underlying element in the vector.
Definition StackHeapVector.h:394
Iterator & operator++()
(Pre-) increments this iterator.
Definition StackHeapVector.h:376
Vector like data structure combining stack and heap memory.
Definition StackHeapVector.h:27
size_t size_
The number of elements in this vector.
Definition StackHeapVector.h:364
StackHeapVector(const size_t size, const T &element)
Creates a new vector object.
Definition StackHeapVector.h:472
StackHeapVector(const std::vector< T > &elements)
Creates a new vector object and copies the elements to this vector.
Definition StackHeapVector.h:494
Iterator begin()
Returns an iterator to the first element in this vector.
Definition StackHeapVector.h:772
std::vector< T > heapElements_
The remaining elements located on the heap.
Definition StackHeapVector.h:361
StackHeapVector()
Creates a new vector object.
Definition StackHeapVector.h:460
StackHeapVector(const std::initializer_list< T > elements)
Creates a new vector object and copies the elements to this vector.
Definition StackHeapVector.h:505
const T & operator[](const size_t index) const
Elements access operator.
Definition StackHeapVector.h:796
T stackElements_[tStackCapacity]
The elements located on the stack.
Definition StackHeapVector.h:358
void assign(const size_t size, const T &element)
Replaces the content of the vector with 'size' copies of the provided element.
Definition StackHeapVector.h:654
const T & back() const
Returns the last element of this vector.
Definition StackHeapVector.h:742
T & emplaceBack(TArgs &&... args)
Emplaces a new element to the end of this vector.
Definition StackHeapVector.h:571
Iterator end()
Returns an iterator to the element following the last element in this vector.
Definition StackHeapVector.h:778
size_t capacity() const
Returns the overall capacity of this vector (including the capacity on the stack and on the heap).
Definition StackHeapVector.h:689
void reserve(const size_t capacity)
Reserves a specified capacity for this vector.
Definition StackHeapVector.h:714
bool operator==(const StackHeapVector< T, tStackCapacity > &other) const
Compares two vectors for equality.
Definition StackHeapVector.h:822
const T & front() const
Returns the first element of this vector.
Definition StackHeapVector.h:726
void pushBack(T &&element)
Pushes a new element to the end of this vector.
Definition StackHeapVector.h:540
void resize(const size_t size)
Resizes the vector.
Definition StackHeapVector.h:607
ConstIterator begin() const
Returns a const iterator to the first element in this vector.
Definition StackHeapVector.h:784
StackHeapVector(const StackHeapVector< T, tStackCapacity > &other)
Copy constructor.
Definition StackHeapVector.h:529
StackHeapVector(const size_t size)
Creates a new vector object.
Definition StackHeapVector.h:466
T & operator[](const size_t index)
Elements access operator.
Definition StackHeapVector.h:809
void clear()
Clears this vector.
Definition StackHeapVector.h:701
StackHeapVector< T, tStackCapacity > & operator=(const StackHeapVector< T, tStackCapacity > &other)
Copy assignment operator.
Definition StackHeapVector.h:865
T & back()
Returns the last element of this vector.
Definition StackHeapVector.h:757
T & front()
Returns the first element of this vector.
Definition StackHeapVector.h:734
StackHeapVector(std::vector< T > &&elements)
Creates a new vector object and moves the elements to this vector.
Definition StackHeapVector.h:483
StackHeapVector< T, tStackCapacity > & operator=(StackHeapVector< T, tStackCapacity > &&other) noexcept
Move assignment operator.
Definition StackHeapVector.h:841
ConstIterator end() const
Returns an iterator to the element following the last element in this vector.
Definition StackHeapVector.h:790
void pushBack(const T &element)
Pushes a new element to the end of this vector.
Definition StackHeapVector.h:555
bool isEmpty() const
Returns whether this vector is empty.
Definition StackHeapVector.h:695
StackHeapVector(StackHeapVector< T, tStackCapacity > &&other) noexcept
Move constructor.
Definition StackHeapVector.h:516
void popBack()
Removed the last elements from the vector.
Definition StackHeapVector.h:590
size_t size() const
Returns the number of elements of this vector.
Definition StackHeapVector.h:681
The namespace covering the entire Ocean framework.
Definition Accessor.h:15