12 #include <cuda_runtime.h> 13 #include <cuda_runtime_api.h> 15 #include <muda/type_traits/type_modifier.h> 17 #include <muda/buffer/buffer_fwd.h> 18 #include <muda/view/view_base.h> 22 template <
bool IsConst,
typename T>
27 static_assert(!std::is_const_v<T>,
"Ty must be non-const");
34 using ThisViewer = std::conditional_t<IsConst, CViewer, Viewer>;
37 using auto_const_t =
typename Base::template auto_const_t<U>;
40 auto_const_t<T>* m_data =
nullptr;
46 MUDA_GENERIC
BufferViewBase(auto_const_t<T>* data,
size_t offset,
size_t size) MUDA_NOEXCEPT
52 MUDA_GENERIC
BufferViewBase(auto_const_t<T>* data,
size_t size) MUDA_NOEXCEPT
57 MUDA_GENERIC
ConstView as_const()
const MUDA_NOEXCEPT
59 return ConstView{m_data, m_offset, m_size};
62 MUDA_GENERIC
operator ConstView()
const MUDA_NOEXCEPT {
return as_const(); }
65 MUDA_GENERIC auto_const_t<T>* data() MUDA_NOEXCEPT
67 return m_data + m_offset;
70 MUDA_GENERIC auto_const_t<T>* data(
size_t i) MUDA_NOEXCEPT
76 MUDA_GENERIC auto_const_t<T>* origin_data() MUDA_NOEXCEPT {
return m_data; }
77 MUDA_GENERIC
ThisView subview(
size_t offset,
size_t size = ~0) MUDA_NOEXCEPT;
78 MUDA_GENERIC ThisViewer viewer() MUDA_NOEXCEPT;
82 MUDA_GENERIC
size_t size()
const MUDA_NOEXCEPT {
return m_size; }
83 MUDA_GENERIC
const T* data()
const MUDA_NOEXCEPT
85 return remove_const(*this).data();
87 MUDA_GENERIC
const T* data(
size_t i)
const MUDA_NOEXCEPT
89 return remove_const(*this).data(i);
91 MUDA_GENERIC
const T* origin_data()
const MUDA_NOEXCEPT {
return m_data; }
92 MUDA_GENERIC
size_t offset()
const MUDA_NOEXCEPT {
return m_offset; }
94 MUDA_GENERIC
ConstView subview(
size_t offset,
size_t size = ~0)
const MUDA_NOEXCEPT;
95 MUDA_GENERIC
CViewer cviewer()
const MUDA_NOEXCEPT;
98 MUDA_GENERIC auto_const_t<T>& operator[](
size_t i) MUDA_NOEXCEPT
103 MUDA_GENERIC
const T& operator[](
size_t i)
const MUDA_NOEXCEPT
113 using value_type = T;
114 using reference = T&;
116 using iterator_category = std::random_access_iterator_tag;
117 using difference_type = size_t;
119 MUDA_GENERIC
ThisView operator+(
int i)
121 return ThisView{m_data, m_offset + i, m_size - i};
123 MUDA_GENERIC
ConstView operator+(
int i)
const 125 return remove_const(*this).operator+(i).as_const();
127 MUDA_GENERIC reference operator*() {
return *data(0); }
128 MUDA_GENERIC auto_const_t<T>& operator[](
int i) {
return *data(i); }
129 MUDA_GENERIC
const T& operator[](
int i)
const {
return *data(i); }
132 template <
typename T>
145 MUDA_GENERIC
CBufferView<T> subview(
size_t offset,
size_t size = ~0)
const MUDA_NOEXCEPT
147 return CBufferView{Base::subview(offset, size)};
150 MUDA_GENERIC
CBufferView<T> subview(
size_t offset,
size_t size = ~0) MUDA_NOEXCEPT
152 return CBufferView{Base::subview(offset, size)};
155 MUDA_HOST
void copy_to(T* host)
const;
157 MUDA_GENERIC
auto as_const()
const MUDA_NOEXCEPT {
return *
this; }
160 template <
typename T>
166 using Base::BufferViewBase;
168 using Base::origin_data;
177 MUDA_GENERIC BufferView(
Dense1D<T> viewer) MUDA_NOEXCEPT
178 :
Base(viewer.data(), 0, (size_t)viewer.total_size())
192 MUDA_GENERIC
BufferView<T> subview(
size_t offset,
size_t size = ~0) MUDA_NOEXCEPT
194 return BufferView{Base::subview(offset, size)};
197 MUDA_GENERIC
CBufferView<T> subview(
size_t offset,
size_t size = ~0)
const MUDA_NOEXCEPT
202 MUDA_HOST
void fill(
const T& v);
204 MUDA_HOST
void copy_from(
const T* host);
205 MUDA_HOST
void copy_to(T* host)
const 211 template <
typename T>
217 template <
typename T>
224 #include "details/buffer_view.inl" Definition: view_base.h:7
Definition: type_modifier.h:21
Definition: type_modifier.h:27
Definition: buffer_view.h:23
Definition: buffer_fwd.h:12
A C/C++ array like viewer for kernel access, with safe checking on any input.
Definition: dense_1d.h:26
Definition: buffer_fwd.h:15