2#include "gaia/config/config.h"
10#include "gaia/core/iterator.h"
11#include "gaia/core/utility.h"
12#include "gaia/mem/data_layout_policy.h"
13#include "gaia/mem/mem_utils.h"
14#include "gaia/mem/raw_data_holder.h"
19 namespace sarr_soa_detail {
27 struct sarr_soa_iterator {
35 using size_type = sarr_soa_detail::size_type;
47 sarr_soa_iterator(uint8_t* ptr, uint32_t cnt, uint32_t idx): m_ptr(ptr), m_cnt(cnt), m_idx(idx) {}
50 return mem::data_view_policy<T::gaia_Data_Layout, T>::get({m_ptr, m_cnt}, m_idx);
52 T operator->()
const {
53 return mem::data_view_policy<T::gaia_Data_Layout, T>::get({m_ptr, m_cnt}, m_idx);
56 return iterator(m_ptr, m_cnt, m_idx + offset);
87 return iterator(m_ptr, m_cnt, m_idx + offset);
90 return iterator(m_ptr, m_cnt, m_idx + offset);
93 GAIA_ASSERT(m_ptr == other.m_ptr);
98 GAIA_ASSERT(m_ptr == other.m_ptr);
99 return m_idx == other.m_idx;
102 GAIA_ASSERT(m_ptr == other.m_ptr);
103 return m_idx != other.m_idx;
105 GAIA_NODISCARD
bool operator>(
const iterator& other)
const {
106 GAIA_ASSERT(m_ptr == other.m_ptr);
107 return m_idx > other.m_idx;
109 GAIA_NODISCARD
bool operator>=(
const iterator& other)
const {
110 GAIA_ASSERT(m_ptr == other.m_ptr);
111 return m_idx >= other.m_idx;
113 GAIA_NODISCARD
bool operator<(
const iterator& other)
const {
114 GAIA_ASSERT(m_ptr == other.m_ptr);
115 return m_idx < other.m_idx;
117 GAIA_NODISCARD
bool operator<=(
const iterator& other)
const {
118 GAIA_ASSERT(m_ptr == other.m_ptr);
119 return m_idx <= other.m_idx;
123 template <
typename T>
124 struct const_sarr_soa_iterator {
129 using size_type = sarr_soa_detail::size_type;
131 using iterator = const_sarr_soa_iterator;
135 const uint8_t* m_ptr;
140 const_sarr_soa_iterator(
const uint8_t* ptr, uint32_t cnt, uint32_t idx): m_ptr(ptr), m_cnt(cnt), m_idx(idx) {}
142 T operator*()
const {
143 return mem::data_view_policy<T::gaia_Data_Layout, T>::get({m_ptr, m_cnt}, m_idx);
145 T operator->()
const {
146 return mem::data_view_policy<T::gaia_Data_Layout, T>::get({m_ptr, m_cnt}, m_idx);
149 return iterator(m_ptr, m_cnt, m_idx + offset);
180 return iterator(m_ptr, m_cnt, m_idx + offset);
183 return iterator(m_ptr, m_cnt, m_idx + offset);
186 GAIA_ASSERT(m_ptr == other.m_ptr);
191 GAIA_ASSERT(m_ptr == other.m_ptr);
192 return m_idx == other.m_idx;
195 GAIA_ASSERT(m_ptr == other.m_ptr);
196 return m_idx != other.m_idx;
198 GAIA_NODISCARD
bool operator>(
const iterator& other)
const {
199 GAIA_ASSERT(m_ptr == other.m_ptr);
200 return m_idx > other.m_idx;
202 GAIA_NODISCARD
bool operator>=(
const iterator& other)
const {
203 GAIA_ASSERT(m_ptr == other.m_ptr);
204 return m_idx >= other.m_idx;
206 GAIA_NODISCARD
bool operator<(
const iterator& other)
const {
207 GAIA_ASSERT(m_ptr == other.m_ptr);
208 return m_idx < other.m_idx;
210 GAIA_NODISCARD
bool operator<=(
const iterator& other)
const {
211 GAIA_ASSERT(m_ptr == other.m_ptr);
212 return m_idx <= other.m_idx;
221 template <
typename T, sarr_soa_detail::
size_type N>
223 static_assert(mem::is_soa_layout_v<T>,
"sarr_soa can be used only with soa types");
226 static_assert(
N > 0);
258 mem::raw_data_holder<T, allocated_bytes>
m_data;
276 template <
typename InputIt>
278 const auto count = (
size_type)core::distance(first, last);
280 if constexpr (std::is_pointer_v<InputIt>) {
282 operator[](
i) = first[
i];
283 }
else if constexpr (std::is_same_v<typename InputIt::iterator_category, core::random_access_iterator_tag>) {
285 operator[](
i) = *(first[
i]);
288 for (
auto it = first;
it != last; ++
it)
289 operator[](++
i) = *
it;
304 GAIA_ASSERT(core::addressof(other) !=
this);
321 GAIA_ASSERT(core::addressof(other) !=
this);
323 mem::copy_elements<T, true>(
334 GAIA_ASSERT(core::addressof(other) !=
this);
336 mem::move_elements<T, true>(
343 GAIA_CLANG_WARNING_PUSH()
345 GAIA_CLANG_WARNING_DISABLE("-
Wcast-align")
370 GAIA_NODISCARD
decltype(
auto)
operator[](
size_type pos)
const noexcept {
375 GAIA_CLANG_WARNING_POP()
416 return (
operator[])(
N - 1);
502 if (!(
operator[](
i) == other[
i]))
517 template <
size_t Item>
526 template <
size_t Item>
535 template <
typename T, uint32_t N, uint32_t... I>
536 sarr_soa<std::remove_cv_t<T>, N> to_array_impl(T (&a)[N], std::index_sequence<I...> ) {
547 template <
typename T, u
int32_t N>
548 sarr_soa<std::remove_cv_t<T>, N> to_array(T (&a)[N]) {
549 return detail::to_array_impl(a, std::make_index_sequence<N>{});
555 template <
typename T,
typename... U>
556 sarr_soa(T, U...) -> sarr_soa<T, 1 + (uint32_t)
sizeof...(U)>;
563 template <
typename T, u
int32_t N>
564 struct tuple_size<gaia::cnt::sarr_soa<T, N>>: std::integral_constant<uint32_t, N> {};
566 template <
size_t I,
typename T, u
int32_t N>
567 struct tuple_element<I, gaia::cnt::sarr_soa<T, N>> {
Array with variable size of elements of type.
Definition darray_impl.h:27
darr_detail::size_type size_type
Unsigned type used for sizes and indices.
Definition darray_impl.h:44
GAIA_NODISCARD decltype(auto) operator[](size_type pos) noexcept
Accesses an element without bounds checking in optimized builds.
Definition darray_impl.h:206
core::random_access_iterator_tag iterator_category
Iterator category exposed by the container.
Definition darray_impl.h:51
GAIA_NODISCARD auto begin() noexcept
Returns an iterator to the first element.
Definition darray_impl.h:556
GAIA_NODISCARD bool operator==(const darr &other) const noexcept
Compares two containers element by element.
Definition darray_impl.h:629
T value_type
Element type stored by the container.
Definition darray_impl.h:30
pointer iterator
Mutable random-access iterator type.
Definition darray_impl.h:47
darr_detail::difference_type difference_type
Type used for iterator differences.
Definition darray_impl.h:42
GAIA_NODISCARD constexpr bool operator!=(const darr &other) const noexcept
Checks whether two containers differ.
Definition darray_impl.h:642
GAIA_NODISCARD auto end() noexcept
Returns an iterator one past the last element.
Definition darray_impl.h:592
Fixed-size stack array with SoA storage. Interface compatiblity with std::array where it matters.
Definition sarray_soa_impl.h:222
GAIA_NODISCARD auto cbegin() const noexcept
Returns a read-only iterator to the first element.
Definition sarray_soa_impl.h:439
GAIA_NODISCARD decltype(auto) operator[](size_type pos) noexcept
Accesses an element without bounds checking in optimized builds.
Definition sarray_soa_impl.h:362
GAIA_NODISCARD auto cend() const noexcept
Returns a read-only iterator one past the last element.
Definition sarray_soa_impl.h:475
GAIA_NODISCARD auto begin() noexcept
Returns an iterator to the first element.
Definition sarray_soa_impl.h:427
auto view() const noexcept
Returns a read-only view of one structure-of-arrays member.
Definition sarray_soa_impl.h:527
sarr_soa_detail::difference_type difference_type
Type used for iterator differences.
Definition sarray_soa_impl.h:241
GAIA_NODISCARD const_pointer data() const noexcept
Returns a pointer to the element storage.
Definition sarray_soa_impl.h:355
GAIA_NODISCARD constexpr size_type size() const noexcept
Returns the number of elements.
Definition sarray_soa_impl.h:379
GAIA_NODISCARD bool operator!=(const sarr_soa &other) const
Checks whether two containers differ.
Definition sarray_soa_impl.h:510
sarr_soa & operator=(const sarr_soa &other)
Copy-assigns the container.
Definition sarray_soa_impl.h:320
GAIA_NODISCARD auto rbegin() const noexcept
Returns a reverse traversal iterator to the last element.
Definition sarray_soa_impl.h:451
static constexpr uint32_t allocated_bytes
Number of bytes reserved by the inline storage.
Definition sarray_soa_impl.h:255
GAIA_NODISCARD decltype(auto) front() noexcept
Accesses the first element.
Definition sarray_soa_impl.h:403
auto view_mut() noexcept
Returns a mutable view of one structure-of-arrays member.
Definition sarray_soa_impl.h:518
GAIA_NODISCARD auto begin() const noexcept
Returns an iterator to the first element.
Definition sarray_soa_impl.h:433
sarr_soa_iterator< T > iterator
Mutable random-access iterator type.
Definition sarray_soa_impl.h:246
GAIA_NODISCARD auto rbegin() noexcept
Returns a reverse traversal iterator to the last element.
Definition sarray_soa_impl.h:445
sarr_soa(std::initializer_list< T > il)
Constructs a container from an initializer list.
Definition sarray_soa_impl.h:295
GAIA_NODISCARD decltype(auto) back() noexcept
Accesses the last element.
Definition sarray_soa_impl.h:415
GAIA_NODISCARD auto end() noexcept
Returns an iterator one past the last element.
Definition sarray_soa_impl.h:463
GAIA_NODISCARD auto crbegin() const noexcept
Returns a read-only reverse traversal iterator to the last element.
Definition sarray_soa_impl.h:457
const_sarr_soa_iterator< T > const_iterator
Read-only random-access iterator type.
Definition sarray_soa_impl.h:248
GAIA_NODISCARD constexpr bool empty() const noexcept
Checks whether the container has no elements.
Definition sarray_soa_impl.h:385
GAIA_NODISCARD pointer data() noexcept
Returns a pointer to the element storage.
Definition sarray_soa_impl.h:349
sarr_soa(const sarr_soa &other)
Copy-constructs a container.
Definition sarray_soa_impl.h:299
GAIA_NODISCARD decltype(auto) front() const noexcept
Accesses the first element.
Definition sarray_soa_impl.h:409
sarr_soa & operator=(std::initializer_list< T > il)
Replaces the elements from an initializer list.
Definition sarray_soa_impl.h:312
GAIA_NODISCARD decltype(auto) back() const noexcept
Accesses the last element.
Definition sarray_soa_impl.h:421
sarr_soa(InputIt first, InputIt last) noexcept
Constructs a container from an iterator range.
Definition sarray_soa_impl.h:277
GAIA_NODISCARD constexpr size_type max_size() const noexcept
Returns the maximum number of elements supported by this container.
Definition sarray_soa_impl.h:397
mem::raw_data_holder< T, allocated_bytes > m_data
Inline storage backing the container elements.
Definition sarray_soa_impl.h:258
sarr_soa_detail::size_type size_type
Unsigned type used for sizes and indices.
Definition sarray_soa_impl.h:243
sarr_soa & operator=(sarr_soa &&other) noexcept
Move-assigns the container.
Definition sarray_soa_impl.h:333
sarr_soa(sarr_soa &&other) noexcept
Move-constructs a container.
Definition sarray_soa_impl.h:303
GAIA_NODISCARD auto end() const noexcept
Returns an iterator one past the last element.
Definition sarray_soa_impl.h:469
GAIA_NODISCARD auto rend() const noexcept
Returns the reverse traversal sentinel preceding the first element.
Definition sarray_soa_impl.h:487
GAIA_NODISCARD auto rend() noexcept
Returns the reverse traversal sentinel preceding the first element.
Definition sarray_soa_impl.h:481
GAIA_NODISCARD constexpr size_type capacity() const noexcept
Returns the number of elements that fit without reallocation.
Definition sarray_soa_impl.h:391
GAIA_NODISCARD auto crend() const noexcept
Returns the read-only reverse traversal sentinel preceding the first element.
Definition sarray_soa_impl.h:493
static constexpr size_type extent
Fixed capacity of the container.
Definition sarray_soa_impl.h:253
GAIA_NODISCARD bool operator==(const sarr_soa &other) const
Compares two containers element by element.
Definition sarray_soa_impl.h:500
View policy for accessing and storing data in the SoA way. Good for SIMD processing.
Definition data_layout_policy.h:402
GAIA_NODISCARD static constexpr ValueType get(std::span< const uint8_t > s, size_t idx) noexcept
Reconstructs a value from its SoA fields.
Definition data_layout_policy.h:530
uint8_t * TargetCastType
Pointer type used to address SoA storage.
Definition data_layout_policy.h:408
GAIA_NODISCARD static constexpr uint32_t get_min_byte_size(uintptr_t addr, size_t cnt) noexcept
Calculates the bytes required for an SoA value range.
Definition data_layout_policy.h:431
GAIA_NODISCARD static constexpr auto set(std::span< uint8_t > s, size_t idx) noexcept
Returns a mutable proxy for one complete value.
Definition data_layout_policy.h:582
Storage policy for a selected layout and item type.
Definition data_layout_policy.h:123