muda
var_view.h
1 #pragma once
2 #include <cuda.h>
3 #include <cinttypes>
4 #include <muda/view/view_base.h>
5 #include <muda/viewer/dense.h>
6 
7 namespace muda
8 {
9 template <bool IsConst, typename T>
10 class VarViewBase : public ViewBase<IsConst>
11 {
12  using Base = ViewBase<IsConst>;
13 
14  protected:
15  template <typename U>
16  using auto_const_t = typename Base::template auto_const_t<U>;
17 
18  auto_const_t<T>* m_data = nullptr;
19 
20  public:
24 
25  using ConstViewer = CDense<T>;
26  using NonConstViewer = Dense<T>;
27  using ThisViewer = typename std::conditional_t<IsConst, ConstViewer, NonConstViewer>;
28 
29 
30  MUDA_GENERIC VarViewBase() MUDA_NOEXCEPT : m_data(nullptr) {}
31  MUDA_GENERIC VarViewBase(auto_const_t<T>* data) MUDA_NOEXCEPT : m_data(data)
32  {
33  }
34 
35  MUDA_GENERIC auto_const_t<T>* data() MUDA_NOEXCEPT { return m_data; }
36  MUDA_GENERIC const T* data() const MUDA_NOEXCEPT { return m_data; }
37 
38  MUDA_GENERIC auto cviewer() const MUDA_NOEXCEPT
39  {
40  return ConstViewer{m_data};
41  }
42  MUDA_GENERIC auto viewer() MUDA_NOEXCEPT { return ThisViewer{m_data}; }
43 
44  /**********************************************************************************
45  * VarView As Iterator
46  ***********************************************************************************/
47 
48  // Random Access Iterator Interface
49  using value_type = T;
50  using reference = T&;
51  using pointer = T*;
52  using iterator_category = std::random_access_iterator_tag;
53  using difference_type = size_t;
54 
55  MUDA_GENERIC reference operator*() { return *data(); }
56  MUDA_GENERIC auto_const_t<T>& operator[](int i) { return *data(); }
57  MUDA_GENERIC const T& operator[](int i) const { return *data(); }
58 };
59 
60 template <typename T>
61 class CVarView : public VarViewBase<true, T>
62 {
63  using Base = VarViewBase<true, T>;
64 
65  public:
66  using Base::Base;
67  MUDA_GENERIC CVarView(const Base& base) MUDA_NOEXCEPT : Base(base){};
68  void copy_to(T* data) const;
69 };
70 
71 template <typename T>
72 class VarView : public VarViewBase<false, T>
73 {
75 
76  public:
77  using Base::Base;
78  MUDA_GENERIC VarView(const Base& base) MUDA_NOEXCEPT : Base(base) {}
79 
80  MUDA_GENERIC auto as_const() const MUDA_NOEXCEPT
81  {
82  return CVarView<T>{this->m_data};
83  }
84 
85  void copy_from(const T* data);
86  void copy_from(CVarView<T> data);
87  void fill(const T& value);
88  void copy_to(T* data) const { as_const().copy_to(data); }
89 };
90 
91 // viewer traits
92 template <typename T>
94 {
95  using type = CVarView<T>;
96 };
97 
98 template <typename T>
100 {
101  using type = VarView<T>;
102 };
103 
104 // CTAD
105 template <typename T>
106 CVarView(T*) -> CVarView<T>;
107 
108 template <typename T>
109 VarView(T*) -> VarView<T>;
110 } // namespace muda
111 
112 
113 #include "details/var_view.inl"
Definition: view_base.h:7
Definition: type_modifier.h:21
Definition: buffer_fwd.h:9
Definition: type_modifier.h:27
Definition: dense_0d.h:83
Definition: dense_0d.h:7
Definition: assert.h:13
Definition: buffer_fwd.h:6
Definition: var_view.h:10