Arcane
v3.15.3.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
30
namespace
Arcane::Accelerator::impl
31
{
32
class
AtomicImpl;
33
}
34
namespace
Arcane
35
{
36
37
/*---------------------------------------------------------------------------*/
38
/*---------------------------------------------------------------------------*/
39
/*!
40
* \brief Classe pour accéder à un élément d'une vue en lecture.
41
*/
42
template
<
typename
DataType>
43
class
DataViewGetter
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
*/
60
template
<
typename
DataType>
61
class
DataViewSetter
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
*/
242
template
<
typename
DataType>
243
class
DataViewGetterSetter
244
:
public
DataViewSetter
<DataType>
245
{
246
using
BaseType
=
DataViewSetter<DataType>
;
247
using
BaseType::m_ptr;
248
friend
class
Arcane::Accelerator::impl::AtomicImpl
;
249
250
public
:
251
252
using
ValueType = DataType;
253
using
AccessorReturnType
=
DataViewGetterSetter<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
{
287
return
DataViewGetterSetter<typename DataTypeTraitsT<X>::SubscriptType
>(&m_ptr->operator[](index));
288
}
289
290
template
<
typename
X = DataType>
constexpr
ARCCORE_HOST_DEVICE
auto
291
operator()(Int32
i0
) ->
DataViewGetterSetter<typename DataTypeTraitsT<X>::FunctionCall1ReturnType
>
292
{
293
return
DataViewGetterSetter<typename DataTypeTraitsT<X>::FunctionCall1ReturnType
>(&m_ptr->operator()(
i0
));
294
}
295
296
template
<
typename
X = DataType>
constexpr
ARCCORE_HOST_DEVICE
auto
297
operator()(Int32
i0
, Int32
i1
) ->
DataViewGetterSetter<typename DataTypeTraitsT<X>::FunctionCall2ReturnType
>
298
{
299
return
DataViewGetterSetter<typename DataTypeTraitsT<X>::FunctionCall2ReturnType
>(&m_ptr->operator()(
i0
,
i1
));
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
Arcane::Accelerator::impl::AtomicImpl
Definition
accelerator/Atomic.h:139
Arcane::DataTypeTraitsT
Definition
DataTypeTraits.h:40
Arcane::DataViewGetterSetter
Classe pour accéder à un élément d'une vue en lecture/écriture.
Definition
DataView.h:245
Arcane::DataViewGetter
Classe pour accéder à un élément d'une vue en lecture.
Definition
DataView.h:44
Arcane::DataViewSetter
Classe pour accéder à un élément d'une vue en écriture.
Definition
DataView.h:62
Arccore::Ref
Référence à une instance.
Definition
arccore/src/base/arccore/base/Ref.h:143
Arcane
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Definition
AbstractCaseDocumentVisitor.cc:20
arcane
core
DataView.h
Généré le Lundi 10 Février 2025 02:47:08 pour Arcane par
1.9.8