215 static_assert(mem::is_soa_layout_v<T>,
"sarr_soa can be used only with soa types");
218 static_assert(
N > 0);
220 using value_type = T;
221 using reference = T&;
222 using const_reference =
const T&;
224 using const_pointer = T*;
227 using size_type = sarr_soa_detail::size_type;
233 static constexpr size_type extent =
N;
234 static constexpr uint32_t allocated_bytes = view_policy::get_min_byte_size(0,
N);
244 for (
auto i = (size_type)0;
i < extent; ++
i)
250 template <
typename InputIt>
252 const auto count = (size_type)core::distance(first, last);
254 if constexpr (std::is_pointer_v<InputIt>) {
255 for (size_type
i = 0;
i < count; ++
i)
256 operator[](
i) = first[
i];
257 }
else if constexpr (std::is_same_v<typename InputIt::iterator_category, core::random_access_iterator_tag>) {
258 for (size_type i = 0; i < count; ++i)
259 operator[](i) = *(first[i]);
262 for (
auto it = first; it != last; ++it)
263 operator[](++i) = *it;
267 sarr_soa(std::initializer_list<T> il): sarr_soa(il.begin(), il.end()) {}
269 sarr_soa(
const sarr_soa& other): sarr_soa(other.begin(), other.end()) {}
271 sarr_soa(sarr_soa&& other)
noexcept {
272 GAIA_ASSERT(core::addressof(other) !=
this);
274 mem::move_elements<T, true>((uint8_t*)m_data, (uint8_t*)other.m_data, other.size(), 0, extent, other.extent);
277 sarr_soa& operator=(std::initializer_list<T> il) {
278 *
this = sarr_soa(il.begin(), il.end());
282 sarr_soa& operator=(
const sarr_soa& other) {
283 GAIA_ASSERT(core::addressof(other) !=
this);
285 mem::copy_elements<T, true>(
286 GAIA_ACC((uint8_t*)&m_data[0]), GAIA_ACC((
const uint8_t*)&other.m_data[0]), other.size(), 0, extent,
292 sarr_soa& operator=(sarr_soa&& other)
noexcept {
293 GAIA_ASSERT(core::addressof(other) !=
this);
295 mem::move_elements<T, true>(
296 GAIA_ACC((uint8_t*)&m_data[0]), GAIA_ACC((uint8_t*)&other.m_data[0]), other.size(), 0, extent,
302 GAIA_CLANG_WARNING_PUSH()
304 GAIA_CLANG_WARNING_DISABLE("-Wcast-align")
306 GAIA_NODISCARD pointer data() noexcept {
307 return GAIA_ACC((pointer)&m_data[0]);
310 GAIA_NODISCARD const_pointer data() const noexcept {
311 return GAIA_ACC((const_pointer)&m_data[0]);
314 GAIA_NODISCARD
decltype(
auto)
operator[](size_type pos)
noexcept {
315 GAIA_ASSERT(pos < size());
316 return view_policy::set({GAIA_ACC((
typename view_policy::TargetCastType) & m_data[0]), extent}, pos);
319 GAIA_NODISCARD
decltype(
auto)
operator[](size_type pos)
const noexcept {
320 GAIA_ASSERT(pos < size());
321 return view_policy::get({GAIA_ACC((
typename view_policy::TargetCastType) & m_data[0]), extent}, pos);
324 GAIA_CLANG_WARNING_POP()
326 GAIA_NODISCARD constexpr size_type size() const noexcept {
330 GAIA_NODISCARD
constexpr bool empty() const noexcept {
334 GAIA_NODISCARD
constexpr size_type capacity() const noexcept {
338 GAIA_NODISCARD
constexpr size_type max_size() const noexcept {
342 GAIA_NODISCARD
decltype(
auto) front() noexcept {
346 GAIA_NODISCARD
decltype(
auto) front() const noexcept {
350 GAIA_NODISCARD
decltype(
auto) back() noexcept {
351 return (
operator[])(N - 1);
354 GAIA_NODISCARD
decltype(
auto) back() const noexcept {
355 return operator[](N - 1);
358 GAIA_NODISCARD
auto begin() noexcept {
359 return iterator(GAIA_ACC(&m_data[0]), extent, 0);
362 GAIA_NODISCARD
auto begin() const noexcept {
363 return const_iterator(GAIA_ACC(&m_data[0]), extent, 0);
366 GAIA_NODISCARD
auto cbegin() const noexcept {
367 return const_iterator(GAIA_ACC(&m_data[0]), extent, 0);
370 GAIA_NODISCARD
auto rbegin() noexcept {
371 return iterator(GAIA_ACC(&m_data[0]), extent, size() - 1);
374 GAIA_NODISCARD
auto rbegin() const noexcept {
375 return const_iterator(m_data, extent, size() - 1);
378 GAIA_NODISCARD
auto crbegin() const noexcept {
379 return const_iterator(m_data, extent, size() - 1);
382 GAIA_NODISCARD
auto end() noexcept {
383 return iterator(GAIA_ACC(&m_data[0]), extent, size());
386 GAIA_NODISCARD
auto end() const noexcept {
387 return const_iterator(GAIA_ACC(&m_data[0]), extent, size());
390 GAIA_NODISCARD
auto cend() const noexcept {
391 return const_iterator(GAIA_ACC(&m_data[0]), extent, size());
394 GAIA_NODISCARD
auto rend() noexcept {
395 return iterator(GAIA_ACC(&m_data[0]), extent, -1);
398 GAIA_NODISCARD
auto rend() const noexcept {
399 return const_iterator(GAIA_ACC(&m_data[0]), extent, -1);
402 GAIA_NODISCARD
auto crend() const noexcept {
403 return const_iterator(GAIA_ACC(&m_data[0]), extent, -1);
406 GAIA_NODISCARD
bool operator==(
const sarr_soa& other)
const {
407 for (size_type i = 0; i < N; ++i)
408 if (!(
operator[](i) == other[i]))
413 GAIA_NODISCARD
bool operator!=(
const sarr_soa& other)
const {
414 return !operator==(other);
417 template <
size_t Item>
418 auto view_mut() noexcept {
419 return mem::data_view_policy<T::gaia_Data_Layout, T>::template set<Item>(
423 template <
size_t Item>
424 auto view() const noexcept {
425 return mem::data_view_policy<T::gaia_Data_Layout, T>::template get<Item>(