44#ifndef NIMBLE_ARRAYVIEW_H
45#define NIMBLE_ARRAYVIEW_H
63 arrayview_t(T* addr,
size_t start,
size_t count) : addr(addr + start), count(count) {}
64 arrayview_t(T* addr,
size_t count) : addr(addr), count(count) {}
69 arrayview_t(std::vector<T>& vect,
size_t start,
size_t count) : addr(vect.
data() + start), count(count) {}
92 template <
class int_t>
100 sub(
size_t start,
size_t count)
const
102 return {addr + start, count};
107 return {addr + start, count};
133 template <
class iter_t>
137 for (T& value : *
this) {
143 template <
class iter_t>
147 for (T& value : *
this) {
153 template <
class iter_t>
157 for (T& value : *
this) {
158 std::swap(value, *other);
170 std::swap(A.addr, B.addr);
171 std::swap(A.count, B.count);
173template <
class T,
class list_t>
174std::vector<arrayview_t<T>>
177 std::vector<arrayview_t<T>> views;
178 views.reserve(counts.size());
179 size_t displacement = 0;
180 for (
auto& count : counts) {
181 views.emplace_back(values, displacement, count);
182 displacement += count;
191 std::unique_ptr<T[]> arr;
192 std::unique_ptr<arrayview_t<T>[]> sections;
194 size_t section_count;
201 : arr{new T[elem_count]},
203 elem_count{elem_count},
204 section_count{section_count}
207 template <
class int_t>
211 size_t displacement = 0;
213 for (
size_t i = 0; i < section_count; ++i) {
214 size_t section_size = (size_t)sect_sizes[i];
215 sections[i] = {scan0, displacement, section_size};
216 displacement += section_size;
223 return section_count;
228 return sections.get();
233 return sections.get();
238 return begin() + section_count;
243 return sections.get()->as_span_of_const_ptr();
248 return begin() + section_count;
251 template <
class int_t>
255 return sections[index];
257 template <
class int_t>
261 return sections[index].as_span_of_const();
263 template <
class int_t,
class int2_t>
267 return sections[section_index][element_index];
269 template <
class int_t,
class int2_t>
273 sections[0].swap(sections[1], sections[2]);
274 return sections[section_index][element_index];
Definition nimble.quanta.arrayview.h:56
arrayview_t sub(size_t start, size_t count) const
Definition nimble.quanta.arrayview.h:100
T * begin() const
Definition nimble.quanta.arrayview.h:72
arrayview_t(T *begin, T *end)
Definition nimble.quanta.arrayview.h:65
arrayview_t(const arrayview_t &s)
Definition nimble.quanta.arrayview.h:66
arrayview_t(T *addr, size_t count)
Definition nimble.quanta.arrayview.h:64
T * data()
Definition nimble.quanta.arrayview.h:88
arrayview_t(T *addr, size_t start, size_t count)
Definition nimble.quanta.arrayview.h:63
void copy_to(iter_t dest) const
Definition nimble.quanta.arrayview.h:145
T & operator[](int_t index) const
Definition nimble.quanta.arrayview.h:94
arrayview_t(arrayview_t &&s)
Definition nimble.quanta.arrayview.h:67
const arrayview_t< const T > & as_span_of_const() const
Definition nimble.quanta.arrayview.h:117
void swap_with(iter_t other) const
Definition nimble.quanta.arrayview.h:155
const arrayview_t< const T > * as_span_of_const_ptr() const
Definition nimble.quanta.arrayview.h:128
T * end() const
Definition nimble.quanta.arrayview.h:77
void copy_from(iter_t source) const
Definition nimble.quanta.arrayview.h:135
arrayview_t()
Definition nimble.quanta.arrayview.h:62
arrayview_t< const T > const_sub(size_t start, size_t count) const
Definition nimble.quanta.arrayview.h:105
arrayview_t< const T > * as_span_of_const_ptr()
Definition nimble.quanta.arrayview.h:123
arrayview_t(std::vector< T > &vect)
Definition nimble.quanta.arrayview.h:68
size_t size() const
Definition nimble.quanta.arrayview.h:83
friend void swap(arrayview_t< U > &A, arrayview_t< U > &B)
arrayview_t(std::vector< T > &vect, size_t start, size_t count)
Definition nimble.quanta.arrayview.h:69
arrayview_t< const T > & as_span_of_const()
Definition nimble.quanta.arrayview.h:110
arrayview_t< T > * end()
Definition nimble.quanta.arrayview.h:236
const arrayview_t< const T > * end() const
Definition nimble.quanta.arrayview.h:246
arrayview_t< T > & operator[](int_t index)
Definition nimble.quanta.arrayview.h:253
const arrayview_t< const T > & operator[](int_t index) const
Definition nimble.quanta.arrayview.h:259
const arrayview_t< const T > * begin() const
Definition nimble.quanta.arrayview.h:241
spanarray(const std::vector< int_t > §_sizes)
Definition nimble.quanta.arrayview.h:208
spanarray(spanarray &&)=default
arrayview_t< T > * begin()
Definition nimble.quanta.arrayview.h:231
spanarray(size_t elem_count, size_t section_count)
Definition nimble.quanta.arrayview.h:200
T & operator()(int_t section_index, int2_t element_index)
Definition nimble.quanta.arrayview.h:265
arrayview_t< T > * data()
Definition nimble.quanta.arrayview.h:226
const T & operator()(int_t section_index, int2_t element_index) const
Definition nimble.quanta.arrayview.h:271
size_t size() const
Definition nimble.quanta.arrayview.h:221
Definition nimble.quanta.arrayview.h:53
void swap(arrayview_t< T > &A, arrayview_t< T > &B)
Definition nimble.quanta.arrayview.h:168
std::vector< arrayview_t< T > > partition_into_arrayviews(std::vector< T > &values, const list_t &counts)
Definition nimble.quanta.arrayview.h:175
Definition kokkos_contact_manager.h:49