Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
DataView.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* DataView.h (C) 2000-2023 */
9/* */
10/* Vues sur des données des variables. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_DATAVIEW_H
13#define ARCANE_CORE_DATAVIEW_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/datatype/DataTypeTraits.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21/*!
22 * \file DataView.h
23 *
24 * Ce fichier contient les déclarations des types pour gérer
25 * les vues pour les accélérateurs.
26 */
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane::Accelerator::impl
31{
32class AtomicImpl;
33}
34namespace Arcane
35{
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39/*!
40 * \brief Classe pour accéder à un élément d'une vue en lecture.
41 */
42template <typename DataType>
44{
45 public:
46
47 using ValueType = const DataType;
48 using AccessorReturnType = const DataType;
49 static ARCCORE_HOST_DEVICE AccessorReturnType build(const DataType* ptr)
50 {
51 return { *ptr };
52 }
53};
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57/*!
58 * \brief Classe pour accéder à un élément d'une vue en écriture.
59 */
60template <typename DataType>
62{
63 // Pour accéder à m_ptr;
64 friend class DataViewGetterSetter<DataType>;
65
66 public:
67
68 using ValueType = DataType;
69 using AccessorReturnType = DataViewSetter<DataType>;
70
71 public:
72
73 explicit ARCCORE_HOST_DEVICE DataViewSetter(DataType* ptr)
74 : m_ptr(ptr)
75 {}
76 ARCCORE_HOST_DEVICE DataViewSetter(const DataViewSetter<DataType>& v)
77 : m_ptr(v.m_ptr)
78 {}
79 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
80 operator=(const DataType& v)
81 {
82 *m_ptr = v;
83 return (*this);
84 }
85 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
86 operator=(const DataViewSetter<DataType>& v)
87 {
88 // Attention: il faut mettre à jour la valeur et pas le pointeur
89 // sinon le code tel que a = b avec 'a' et 'b' deux instances de cette
90 // classe ne fonctionnera pas.
91 *m_ptr = *(v.m_ptr);
92 return (*this);
93 }
94 static ARCCORE_HOST_DEVICE AccessorReturnType build(DataType* ptr)
95 {
96 return AccessorReturnType(ptr);
97 }
98
99 public:
100
101 // Binary arithmetic operators
102 // +=
103 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
104 operator+=(const DataType& v)
105 {
106 *m_ptr = (*m_ptr) + v;
107 return (*this);
108 }
109 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
110 operator+=(const DataViewSetter<DataType>& v)
111 {
112 *m_ptr = (*m_ptr) + *(v.m_ptr);
113 return (*this);
114 }
115
116 // -=
117 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
118 operator-=(const DataType& v)
119 {
120 *m_ptr = (*m_ptr) - v;
121 return (*this);
122 }
123 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
124 operator-=(const DataViewSetter<DataType>& v)
125 {
126 *m_ptr = (*m_ptr) - *(v.m_ptr);
127 return (*this);
128 }
129
130 // *=
131 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
132 operator*=(const DataType& v)
133 {
134 *m_ptr = (*m_ptr) * v;
135 return (*this);
136 }
137 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
138 operator*=(const DataViewSetter<DataType>& v)
139 {
140 *m_ptr = (*m_ptr) * *(v.m_ptr);
141 return (*this);
142 }
143
144 // /=
145 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
146 operator/=(const DataType& v)
147 {
148 *m_ptr = (*m_ptr) / v;
149 return (*this);
150 }
151 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
152 operator/=(const DataViewSetter<DataType>& v)
153 {
154 *m_ptr = (*m_ptr) / *(v.m_ptr);
155 return (*this);
156 }
157
158 public:
159
160 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentX()>>
161 ARCCORE_HOST_DEVICE void setX(typename DataTypeTraitsT<X>::ComponentType value)
162 {
163 m_ptr->x = value;
164 }
165 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentY()>>
166 ARCCORE_HOST_DEVICE void setY(typename DataTypeTraitsT<X>::ComponentType value)
167 {
168 m_ptr->y = value;
169 }
170 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentZ()>>
171 ARCCORE_HOST_DEVICE void setZ(typename DataTypeTraitsT<X>::ComponentType value)
172 {
173 m_ptr->z = value;
174 }
175
176 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentXX()>>
177 ARCCORE_HOST_DEVICE void setXX(Real value)
178 {
179 m_ptr->x.x = value;
180 }
181 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentYX()>>
182 ARCCORE_HOST_DEVICE void setYX(Real value)
183 {
184 m_ptr->y.x = value;
185 }
186 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentZX()>>
187 ARCCORE_HOST_DEVICE void setZX(Real value)
188 {
189 m_ptr->z.x = value;
190 }
191
192 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentXY()>>
193 ARCCORE_HOST_DEVICE void setXY(Real value)
194 {
195 m_ptr->x.y = value;
196 }
197 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentYY()>>
198 ARCCORE_HOST_DEVICE void setYY(Real value)
199 {
200 m_ptr->y.y = value;
201 }
202 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentZY()>>
203 ARCCORE_HOST_DEVICE void setZY(Real value)
204 {
205 m_ptr->z.y = value;
206 }
207
208 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentXZ()>>
209 ARCCORE_HOST_DEVICE void setXZ(Real value)
210 {
211 m_ptr->x.z = value;
212 }
213 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentYZ()>>
214 ARCCORE_HOST_DEVICE void setYZ(Real value)
215 {
216 m_ptr->y.z = value;
217 }
218 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasComponentZZ()>>
219 ARCCORE_HOST_DEVICE void setZZ(Real value)
220 {
221 m_ptr->z.z = value;
222 }
223 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasSubscriptOperator()>>
224 ARCCORE_HOST_DEVICE DataViewSetter<typename DataTypeTraitsT<X>::SubscriptType> operator[](Int32 index)
225 {
226 return DataViewSetter<typename DataTypeTraitsT<X>::SubscriptType>(&m_ptr->operator[](index));
227 }
228
229 private:
230
231 DataType* m_ptr;
232};
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236/*!
237 * \brief Classe pour accéder à un élément d'une vue en lecture/écriture.
238 *
239 * Cette classe étend les fonctionnalités de DataViewSetter en ajoutant
240 * la possibilité d'accéder à la valeur de la donnée.
241 */
242template <typename DataType>
244: public DataViewSetter<DataType>
245{
247 using BaseType::m_ptr;
249
250 public:
251
252 using ValueType = DataType;
254
255 public:
256
257 explicit ARCCORE_HOST_DEVICE DataViewGetterSetter(DataType* ptr)
258 : BaseType(ptr)
259 {}
260 ARCCORE_HOST_DEVICE DataViewGetterSetter(const DataViewGetterSetter& v)
261 : BaseType(v)
262 {}
263 ARCCORE_HOST_DEVICE operator DataType() const
264 {
265 return *m_ptr;
266 }
267 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
268 operator=(const DataViewGetterSetter<DataType>& v)
269 {
270 BaseType::operator=(v);
271 return (*this);
272 }
273 ARCCORE_HOST_DEVICE DataViewSetter<DataType>&
274 operator=(const DataType& v)
275 {
276 BaseType::operator=(v);
277 return (*this);
278 }
279 static ARCCORE_HOST_DEVICE AccessorReturnType build(DataType* ptr)
280 {
281 return AccessorReturnType(ptr);
282 }
283
284 template <typename X = DataType, typename = std::enable_if_t<DataTypeTraitsT<X>::HasSubscriptOperator()>>
285 ARCCORE_HOST_DEVICE DataViewGetterSetter<typename DataTypeTraitsT<X>::SubscriptType> operator[](Int32 index)
286 {
288 }
289
290 template <typename X = DataType> constexpr ARCCORE_HOST_DEVICE auto
292 {
294 }
295
296 template <typename X = DataType> constexpr ARCCORE_HOST_DEVICE auto
298 {
300 }
301
302 private:
303
304 //! Adresse de la donnée. Valide uniquement pour les types simples (i.e pas les Real3)
305 constexpr ARCCORE_HOST_DEVICE DataType* _address() const { return m_ptr; }
306};
307
308/*---------------------------------------------------------------------------*/
309/*---------------------------------------------------------------------------*/
310
311} // namespace Arcane
312
313/*---------------------------------------------------------------------------*/
314/*---------------------------------------------------------------------------*/
315
316#endif
Classe pour accéder à un élément d'une vue en lecture/écriture.
Definition DataView.h:245
Classe pour accéder à un élément d'une vue en lecture.
Definition DataView.h:44
Classe pour accéder à un élément d'une vue en écriture.
Definition DataView.h:62
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-