/home/runner/work/amr-wind/amr-wind/amr-wind/core/Slice.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/core/Slice.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
Slice.H
Go to the documentation of this file.
1#ifndef SLICE_H
2#define SLICE_H
3
4#include <iterator>
5#include "AMReX_Vector.H"
6#include "AMReX_Gpu.H"
7
8namespace amr_wind::utils {
9
10template <typename T>
11struct Slice
12{
13 using value_type = T;
14 using size_t = std::size_t;
15 using size_type = std::size_t;
16 using difference_type = std::ptrdiff_t;
17 using reference = T&;
18 using pointer = T*;
19 using iterator = T*;
20 using reverse_iterator = std::reverse_iterator<iterator>;
21 using const_reference = const T&;
22 using const_pointer = const T*;
23 using const_iterator = const T*;
24 using const_reverse_iterator = const std::reverse_iterator<iterator>;
25
28
29 explicit Slice() : ptr_begin(nullptr), ptr_end(nullptr) {}
30
31 explicit Slice(T* pbegin, const size_t n)
32 : ptr_begin(pbegin), ptr_end(pbegin + n)
33 {}
34
35 explicit Slice(T* pbegin, T* pend) : ptr_begin(pbegin), ptr_end(pend) {}
36
37 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE reference
38 operator[](const size_t idx)
39 {
40 return *(ptr_begin + idx);
41 }
42
43 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const_reference
44 operator[](const size_type idx) const
45 {
46 return *(ptr_begin + idx);
47 }
48
49 // NOLINTNEXTLINE(modernize-use-nodiscard)
50 AMREX_GPU_HOST_DEVICE size_type size() const
51 {
52 return (ptr_end - ptr_begin);
53 }
54
55 AMREX_GPU_HOST_DEVICE pointer data() { return ptr_begin; }
56 AMREX_GPU_HOST_DEVICE iterator begin() { return ptr_begin; }
57 AMREX_GPU_HOST_DEVICE iterator end() { return ptr_end; }
58 // NOLINTNEXTLINE(modernize-use-nodiscard)
59 AMREX_GPU_HOST_DEVICE const_iterator data() const { return ptr_begin; }
60 // NOLINTNEXTLINE(modernize-use-nodiscard)
61 AMREX_GPU_HOST_DEVICE const_iterator begin() const { return ptr_begin; }
62 // NOLINTNEXTLINE(modernize-use-nodiscard)
63 AMREX_GPU_HOST_DEVICE const_iterator end() const { return ptr_end; }
64 // NOLINTNEXTLINE(modernize-use-nodiscard)
65 AMREX_GPU_HOST_DEVICE const_iterator cbegin() const { return ptr_begin; }
66 // NOLINTNEXTLINE(modernize-use-nodiscard)
67 AMREX_GPU_HOST_DEVICE const_iterator cend() const { return ptr_end; }
68};
69
70template <typename T>
71Slice<T> slice(std::vector<T>& vec, const size_t start, const size_t count)
72{
73 AMREX_ASSERT((start + count) <= vec.size());
74 return Slice<T>{&vec[start], count};
75}
76
77template <typename T>
78Slice<T> slice(std::vector<T>& vec, const size_t start)
79{
80 AMREX_ASSERT(start < vec.size());
81 return slice(vec, start, vec.size() - start);
82}
83
84template <typename T>
85Slice<T> slice(amrex::Vector<T>& vec, const size_t start, const size_t count)
86{
87 AMREX_ASSERT((start + count) <= static_cast<size_t>(vec.size()));
88 return Slice<T>{&vec[start], count};
89}
90
91template <typename T>
92Slice<T> slice(amrex::Vector<T>& vec, const size_t start)
93{
94 AMREX_ASSERT(start < static_cast<size_t>(vec.size()));
95 return slice(vec, start, vec.size() - start);
96}
97
98template <typename T>
99Slice<T>
100slice(amrex::Gpu::DeviceVector<T>& vec, const size_t start, const size_t count)
101{
102 AMREX_ASSERT((start + count) <= static_cast<size_t>(vec.size()));
103 return Slice<T>{(vec.data() + start), count};
104}
105
106template <typename T>
107Slice<T> slice(amrex::Gpu::DeviceVector<T>& vec, const size_t start)
108{
109 AMREX_ASSERT(start < static_cast<size_t>(vec.size()));
110 return slice(vec, start, vec.size() - start);
111}
112
113} // namespace amr_wind::utils
114
115#endif /* SLICE_H */
Definition MultiParser.H:7
Slice< T > slice(std::vector< T > &vec, const size_t start, const size_t count)
Definition Slice.H:71
Definition Slice.H:12
AMREX_GPU_HOST_DEVICE const_iterator cbegin() const
Definition Slice.H:65
T * pointer
Definition Slice.H:18
AMREX_GPU_HOST_DEVICE const_iterator cend() const
Definition Slice.H:67
pointer ptr_begin
Definition Slice.H:26
const T * const_iterator
Definition Slice.H:23
AMREX_GPU_HOST_DEVICE const_iterator end() const
Definition Slice.H:63
std::size_t size_type
Definition Slice.H:15
Slice(T *pbegin, const size_t n)
Definition Slice.H:31
AMREX_GPU_HOST_DEVICE pointer data()
Definition Slice.H:55
T value_type
Definition Slice.H:13
Slice(T *pbegin, T *pend)
Definition Slice.H:35
AMREX_GPU_HOST_DEVICE const_iterator begin() const
Definition Slice.H:61
T * iterator
Definition Slice.H:19
AMREX_GPU_HOST_DEVICE iterator end()
Definition Slice.H:57
std::ptrdiff_t difference_type
Definition Slice.H:16
std::reverse_iterator< iterator > reverse_iterator
Definition Slice.H:20
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const_reference operator[](const size_type idx) const
Definition Slice.H:44
AMREX_GPU_HOST_DEVICE iterator begin()
Definition Slice.H:56
AMREX_GPU_HOST_DEVICE size_type size() const
Definition Slice.H:50
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE reference operator[](const size_t idx)
Definition Slice.H:38
AMREX_GPU_HOST_DEVICE const_iterator data() const
Definition Slice.H:59
Slice()
Definition Slice.H:29
const T * const_pointer
Definition Slice.H:22
std::size_t size_t
Definition Slice.H:14
pointer ptr_end
Definition Slice.H:27
const std::reverse_iterator< iterator > const_reverse_iterator
Definition Slice.H:24
const T & const_reference
Definition Slice.H:21
T & reference
Definition Slice.H:17