8#ifndef META_OCEAN_BASE_STACK_HEAP_VECTOR_H
9#define META_OCEAN_BASE_STACK_HEAP_VECTOR_H
25template <
typename T,
size_t tStackCapacity>
28 static_assert(tStackCapacity >= 1,
"Invalid stack capacity!");
215 template <
typename... TArgs>
318 ConstIterator
end()
const;
367template <
typename T,
size_t tStackCapacity>
375template <
typename T,
size_t tStackCapacity>
383template <
typename T,
size_t tStackCapacity>
393template <
typename T,
size_t tStackCapacity>
396 return vector_[index_];
399template <
typename T,
size_t tStackCapacity>
402 ocean_assert(&vector_ == &iterator.
vector_);
404 return &vector_ == &iterator.
vector_ && index_ == iterator.
index_;
407template <
typename T,
size_t tStackCapacity>
410 return !(*
this == iterator);
413template <
typename T,
size_t tStackCapacity>
421template <
typename T,
size_t tStackCapacity>
429template <
typename T,
size_t tStackCapacity>
439template <
typename T,
size_t tStackCapacity>
442 return vector_[index_];
445template <
typename T,
size_t tStackCapacity>
448 ocean_assert(&vector_ == &iterator.
vector_);
450 return &vector_ == &iterator.
vector_ && index_ == iterator.
index_;
453template <
typename T,
size_t tStackCapacity>
456 return !(*
this == iterator);
459template <
typename T,
size_t tStackCapacity>
465template <
typename T,
size_t tStackCapacity>
471template <
typename T,
size_t tStackCapacity>
476 for (
size_t n = 0; n <
size; ++n)
482template <
typename T,
size_t tStackCapacity>
487 for (T& element : elements)
493template <
typename T,
size_t tStackCapacity>
498 for (
const T& element : elements)
504template <
typename T,
size_t tStackCapacity>
509 for (
const T& element : elements)
515template <
typename T,
size_t tStackCapacity>
520 for (
size_t n = 0; n < std::min(
size_, tStackCapacity); ++n)
528template <
typename T,
size_t tStackCapacity>
533 for (
size_t n = 0; n < other.
size(); ++n)
539template <
typename T,
size_t tStackCapacity>
542 if (
size_ < tStackCapacity)
554template <
typename T,
size_t tStackCapacity>
557 if (
size_ < tStackCapacity)
569template <
typename T,
size_t tStackCapacity>
570template <
typename... TArgs>
573 const size_t index =
size_;
577 if (index < tStackCapacity)
585 return heapElements_.emplace_back(std::forward<TArgs>(args)...);
589template <
typename T,
size_t tStackCapacity>
592 ocean_assert(
size_ >= 1);
596 if (
size_ >= tStackCapacity)
606template <
typename T,
size_t tStackCapacity>
618 for (
size_t n =
size; n < std::min(
size_, tStackCapacity); ++n)
623 if (
size_ > tStackCapacity)
625 if (
size < tStackCapacity)
639 for (
size_t n =
size_; n < std::min(
size, tStackCapacity); ++n)
644 if (
size > tStackCapacity)
653template <
typename T,
size_t tStackCapacity>
656 for (
size_t n = 0; n < std::min(
size, tStackCapacity); ++n)
661 for (
size_t n =
size; n < std::min(tStackCapacity,
size_); ++n)
666 if (
size < tStackCapacity)
672 const size_t newHeapSize =
size - tStackCapacity;
680template <
typename T,
size_t tStackCapacity>
688template <
typename T,
size_t tStackCapacity>
694template <
typename T,
size_t tStackCapacity>
700template <
typename T,
size_t tStackCapacity>
703 for (
size_t nStack = 0; nStack < std::min(
size_, tStackCapacity); ++nStack)
713template <
typename T,
size_t tStackCapacity>
718 if (capacity > tStackCapacity)
725template <
typename T,
size_t tStackCapacity>
733template <
typename T,
size_t tStackCapacity>
741template <
typename T,
size_t tStackCapacity>
746 if (
size_ <= tStackCapacity)
756template <
typename T,
size_t tStackCapacity>
761 if (
size_ <= tStackCapacity)
771template <
typename T,
size_t tStackCapacity>
777template <
typename T,
size_t tStackCapacity>
783template <
typename T,
size_t tStackCapacity>
789template <
typename T,
size_t tStackCapacity>
795template <
typename T,
size_t tStackCapacity>
798 ocean_assert(index <
size());
800 if (index < tStackCapacity)
808template <
typename T,
size_t tStackCapacity>
811 ocean_assert(index <
size());
813 if (index < tStackCapacity)
821template <
typename T,
size_t tStackCapacity>
829 for (
size_t n = 0; n <
size_; ++n)
831 if ((*
this)[n] != other[n])
840template <
typename T,
size_t tStackCapacity>
848 for (
size_t n = 0; n < std::min(
size_, tStackCapacity); ++n)
853 for (
size_t n =
size_; n < tStackCapacity; ++n)
864template <
typename T,
size_t tStackCapacity>
872 for (
size_t n = 0; n < other.
size(); ++n)
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