muda
dense_1d.h
Go to the documentation of this file.
1 /*****************************************************************/
10 #pragma once
11 #include <muda/viewer/viewer_base.h>
12 
13 namespace muda
14 {
15 
16 /*****************************************************************************
17  *
18  * Dense1D (1D array)
19  * indexing (x)
20  *
21  * A C/C++ array like viewer.
22  *
23  *****************************************************************************/
24 
25 template <bool IsConst, typename T>
26 class Dense1DBase : public ViewerBase<IsConst>
27 {
28  using Base = ViewerBase<IsConst>;
29  template <typename U>
30  using auto_const_t = typename Base::template auto_const_t<U>;
31 
32  MUDA_VIEWER_COMMON_NAME(Dense1DBase);
33 
34  public:
38 
39  protected:
40  auto_const_t<T>* m_data;
41  int m_dim;
42 
43  public:
44  using value_type = T;
45 
46  MUDA_GENERIC Dense1DBase() MUDA_NOEXCEPT : m_data(nullptr) {}
47 
48  MUDA_GENERIC Dense1DBase(auto_const_t<T>* p, int dim) MUDA_NOEXCEPT : m_data(p),
49  m_dim(dim)
50  {
51  }
52 
53  MUDA_GENERIC auto as_const() const MUDA_NOEXCEPT
54  {
55  return ConstViewer{m_data, m_dim};
56  }
57 
58  MUDA_GENERIC operator ConstViewer() const MUDA_NOEXCEPT
59  {
60  return as_const();
61  }
62 
63 
64  MUDA_GENERIC auto_const_t<T>& operator()(int x) MUDA_NOEXCEPT
65  {
66  check();
67  return m_data[map(x)];
68  }
69 
70  MUDA_GENERIC const T& operator()(int x) const MUDA_NOEXCEPT
71  {
72  return remove_const(*this)(x);
73  }
74 
75  MUDA_GENERIC auto_const_t<T>* data() MUDA_NOEXCEPT { return m_data; }
76  MUDA_GENERIC const T* data() const MUDA_NOEXCEPT { return m_data; }
77 
78 
79  MUDA_GENERIC int total_size() const MUDA_NOEXCEPT { return m_dim; }
80  MUDA_GENERIC int dim() const MUDA_NOEXCEPT { return m_dim; }
81 
82  MUDA_GENERIC ThisViewer subview(int offset) MUDA_NOEXCEPT
83  {
84  auto size = this->m_dim - offset;
85  if constexpr(DEBUG_VIEWER)
86  {
87  if(offset < 0)
88  MUDA_KERNEL_ERROR("Dense1D[%s:%s]: subview out of range, offset=%d size=%d m_dim=(%d)",
89  this->name(),
90  this->kernel_name(),
91  offset,
92  size,
93  this->m_dim);
94  }
95  return ThisViewer{this->m_data + offset, size};
96  }
97 
98  MUDA_GENERIC ThisViewer subview(int offset, int size) MUDA_NOEXCEPT
99  {
100  if constexpr(DEBUG_VIEWER)
101  {
102  if(offset < 0 || offset + size > m_dim)
103  MUDA_KERNEL_ERROR("Dense1D[%s:%s]: subview out of range, offset=%d size=%d m_dim=(%d)",
104  this->name(),
105  this->kernel_name(),
106  offset,
107  size,
108  this->m_dim);
109  }
110  return ThisViewer{this->m_data + offset, size};
111  }
112 
113  MUDA_GENERIC ConstViewer subview(int offset) const MUDA_NOEXCEPT
114  {
115  return remove_const(*this).subview(offset).as_const();
116  }
117 
118  MUDA_GENERIC ConstViewer subview(int offset, int size) const MUDA_NOEXCEPT
119  {
120  return remove_const(*this).subview(offset, size).as_const();
121  }
122 
123  protected:
124  MUDA_INLINE MUDA_GENERIC void check() const MUDA_NOEXCEPT
125  {
126  if constexpr(DEBUG_VIEWER)
127  if(m_data == nullptr)
128  MUDA_KERNEL_ERROR("Dense1D[%s:%s]: m_data is null",
129  this->name(),
130  this->kernel_name());
131  }
132 
133  MUDA_GENERIC int map(int x) const MUDA_NOEXCEPT
134  {
135  if constexpr(DEBUG_VIEWER)
136  if(!(x >= 0 && x < m_dim))
137  MUDA_KERNEL_ERROR("Dense1D[%s:%s]: out of range, index=(%d) m_dim=(%d)",
138  this->name(),
139  this->kernel_name(),
140  x,
141  m_dim);
142  return x;
143  }
144 };
145 
146 template <typename T>
148 
149 template <typename T>
151 
152 // viewer traits
153 template <typename T>
155 {
156  using type = CDense1D<T>;
157 };
158 
159 template <typename T>
161 {
162  using type = Dense1D<T>;
163 };
164 
165 // make functions
166 template <typename T>
167 MUDA_INLINE MUDA_GENERIC auto make_cdense_1d(const T* data, int dimx) MUDA_NOEXCEPT
168 {
169  return CDense1D<T>(data, dimx);
170 }
171 
172 template <typename T, int N>
173 MUDA_INLINE MUDA_GENERIC auto make_cdense_1d(const T (&data)[N]) MUDA_NOEXCEPT
174 {
175  return CDense1D<T>(data, N);
176 }
177 
178 template <typename T>
179 MUDA_INLINE MUDA_GENERIC auto make_dense_1d(T* data, int dimx) MUDA_NOEXCEPT
180 {
181  return Dense1D<T>(data, dimx);
182 }
183 
184 template <typename T, int N>
185 MUDA_INLINE MUDA_GENERIC auto make_dense_1d(T (&data)[N]) MUDA_NOEXCEPT
186 {
187  return Dense1D<T>(data, N);
188 }
189 } // namespace muda
Definition: type_modifier.h:21
Definition: type_modifier.h:27
Definition: assert.h:13
Definition: viewer_base.h:21
Definition: dense_1d.h:26