Arcane  4.2.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ArrayViewCommon.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* ArrayViewCommon.h (C) 2000-2026 */
9/* */
10/* Déclarations communes aux classes ArrayView, ConstArrayView et Span. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_ARRAYVIEWCOMMON_H
13#define ARCCORE_BASE_ARRAYVIEWCOMMON_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/ArrayIterator.h"
18
19// Ce fichier d'en-tête n'est requis que lorsque nous voulons afficher les valeurs de la vue.
20// Nous pouvons le supprimer, mais dans ce cas, tout le code utilisateur doit l'inclure explicitement
21// afin de ne pas rompre la compatibilité de la source. Nous l'incluons donc pour le moment (juillet 2026).
22#include "arccore/base/ArrayViewDumper.h"
23
24#include <iosfwd>
25// 'assert' est nécessaire pour le code accélérateur
26#include <assert.h>
27
28#ifndef ARCCORE_COMPILING_FRAMEWORK
29// Cet en-tête n'est pas nécessaire et sera supprimé en juillet 2027
30#include <iostream>
31#endif
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane::Impl
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42template <typename ViewType>
43class ArrayViewDumper;
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48//! Sous-vue correspondant à l'interval \a index sur \a nb_interval
49template <typename ViewType> ARCCORE_HOST_DEVICE auto
50subViewInterval(ViewType view,
51 typename ViewType::size_type index,
52 typename ViewType::size_type nb_interval) -> ViewType
53{
54 using size_type = typename ViewType::size_type;
55 if (nb_interval <= 0)
56 return ViewType();
57 if (index < 0 || index >= nb_interval)
58 return ViewType();
59 size_type n = view.size();
60 size_type isize = n / nb_interval;
61 size_type ibegin = index * isize;
62 // Pour le dernier intervalle, prendre les éléments restants
63 if ((index + 1) == nb_interval)
64 isize = n - ibegin;
65 return ViewType::create(view.data() + ibegin, isize);
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70/*!
71 * \brief Affiche les valeurs de la vue.
72 *
73 * Affiche sur le flot \a o les valeurs de \a val.
74 * Si \a max_print est supérieur à 0, indique le nombre maximum de valeurs
75 * à afficher.
76 */
77template <typename ViewType> inline void
78dumpArray(std::ostream& o, ViewType val, int max_print)
79{
80 ArrayViewDumper<ViewType>::dumpArray(o, val, max_print);
81}
82
83/*---------------------------------------------------------------------------*/
84/*---------------------------------------------------------------------------*/
85
86//! Indique si les deux vues sont égales
87template <typename ViewType> inline bool
88areEqual(ViewType rhs, ViewType lhs)
89{
90 using size_type = typename ViewType::size_type;
91 if (rhs.size() != lhs.size())
92 return false;
93 size_type s = rhs.size();
94 for (size_type i = 0; i < s; ++i) {
95 if (rhs[i] != lhs[i])
96 return false;
97 }
98 return true;
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103
104//! Indique si les deux vues sont égales
105template <typename View2DType> inline bool
106areEqual2D(View2DType rhs, View2DType lhs)
107{
108 using size_type = typename View2DType::size_type;
109 const size_type dim1_size = rhs.dim1Size();
110 const size_type dim2_size = rhs.dim2Size();
111 if (dim1_size != lhs.dim1Size())
112 return false;
113 if (dim2_size != lhs.dim2Size())
114 return false;
115 for (size_type i = 0; i < dim1_size; ++i) {
116 for (size_type j = 0; j < dim2_size; ++j) {
117 if (rhs(i, j) != lhs(i, j))
118 return false;
119 }
120 }
121 return true;
122}
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126
127//! Lance une exception 'ArgumentException'
128extern "C++" ARCCORE_BASE_EXPORT void
129arccoreThrowTooBigInteger [[noreturn]] (std::size_t size);
130
131extern "C++" ARCCORE_BASE_EXPORT void
132arccoreThrowTooBigInt64 [[noreturn]] (std::size_t size);
133
134extern "C++" ARCCORE_BASE_EXPORT void
135arccoreThrowNegativeSize [[noreturn]] (Int64 size);
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
140//! Teste si \a size est positif ou nul et lance une exception si ce n'est pas le cas
141inline constexpr ARCCORE_HOST_DEVICE void
142arccoreCheckIsPositive(Int64 size)
143{
144 if (size < 0) {
145#ifdef ARCCORE_DEVICE_CODE
146 assert("'size' is negative");
147#else
148 Arcane::Impl::arccoreThrowNegativeSize(size);
149#endif
150 }
151}
152
153//! Teste si \a size est plus petit que ARCCORE_INTEGER_MAX et lance une exception si ce n'est pas le cas
154inline constexpr ARCCORE_HOST_DEVICE void
155arccoreCheckIsValidInteger(Int64 size)
156{
157 if (size >= ARCCORE_INTEGER_MAX) {
158#ifdef ARCCORE_DEVICE_CODE
159 assert("'size' is bigger than ARCCORE_INTEGER_MAX");
160#else
161 Arcane::Impl::arccoreThrowTooBigInteger(size);
162#endif
163 }
164}
165
166//! Teste si \a size est plus petit que ARCCORE_INT64_MAX et lance une exception si ce n'est pas le cas
167inline constexpr ARCCORE_HOST_DEVICE void
168arccoreCheckIsValidInt64(size_t size)
169{
170 if (size >= ARCCORE_INT64_MAX) {
171#ifdef ARCCORE_DEVICE_CODE
172 assert("'size' is bigger than ARCCORE_INT64_MAX");
173#else
174 Arcane::Impl::arccoreThrowTooBigInt64(size);
175#endif
176 }
177}
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181
182} // namespace Arcane::impl
183
184namespace Arcane
185{
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
190/*!
191 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
192 * de taille à un tableau.
193 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
194 * une exception de type ArgumentException.
195 */
196inline constexpr ARCCORE_HOST_DEVICE Integer
197arccoreCheckArraySize(unsigned long long size)
198{
199 Arcane::Impl::arccoreCheckIsValidInteger(size);
200 return static_cast<Integer>(size);
201}
202
203/*!
204 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
205 * de taille à un tableau.
206 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
207 * une exception de type ArgumentException.
208 */
209inline constexpr Integer
211{
212 Arcane::Impl::arccoreCheckIsValidInteger(size);
213 Arcane::Impl::arccoreCheckIsPositive(size);
214 return static_cast<Integer>(size);
215}
216
217/*!
218 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
219 * de taille à un tableau.
220 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
221 * une exception de type ArgumentException.
222 */
223inline constexpr ARCCORE_BASE_EXPORT Integer
224arccoreCheckArraySize(unsigned long size)
225{
226 Arcane::Impl::arccoreCheckIsValidInteger(size);
227 return static_cast<Integer>(size);
228}
229
230/*!
231 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
232 * de taille à un tableau.
233 *
234 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
235 * une exception de type ArgumentException.
236 */
237inline constexpr ARCCORE_HOST_DEVICE Integer
239{
240 Arcane::Impl::arccoreCheckIsValidInteger(size);
241 Arcane::Impl::arccoreCheckIsPositive(size);
242 return static_cast<Integer>(size);
243}
244
245/*!
246 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
247 * de taille à un tableau.
248 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
249 * une exception de type ArgumentException.
250 */
251inline constexpr ARCCORE_HOST_DEVICE Integer
252arccoreCheckArraySize(unsigned int size)
253{
254 Arcane::Impl::arccoreCheckIsValidInteger(size);
255 return static_cast<Integer>(size);
256}
257
258/*!
259 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
260 * de taille à un tableau.
261 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
262 * une exception de type ArgumentException.
263 */
264inline constexpr ARCCORE_HOST_DEVICE Integer
266{
267 Arcane::Impl::arccoreCheckIsValidInteger(size);
268 Arcane::Impl::arccoreCheckIsPositive(size);
269 return static_cast<Integer>(size);
270}
271
272/*!
273 * \brief Vérifie que \a size peut être converti dans un 'Int64' pour servir
274 * de taille à un tableau.
275 *
276 * Si possible, retourne \a size convertie en un 'Int64'. Sinon, lance
277 * une exception de type ArgumentException.
278 */
279inline constexpr ARCCORE_HOST_DEVICE Int64
281{
282 Arcane::Impl::arccoreCheckIsValidInt64(size);
283 return static_cast<Int64>(size);
284}
285
286/*---------------------------------------------------------------------------*/
287/*---------------------------------------------------------------------------*/
288
289template <typename IntType> class ArraySizeChecker;
290
291//! Spécialisation pour tester la conversion en Int32
292template <>
294{
295 public:
296
297 template <typename SizeType> ARCCORE_HOST_DEVICE static Int32 check(SizeType size)
298 {
299 return arccoreCheckArraySize(size);
300 }
301};
302
303//! Spécialisation pour tester la conversion en Int64
304template <>
306{
307 public:
308
309 static ARCCORE_HOST_DEVICE Int64 check(std::size_t size)
310 {
311 return arccoreCheckLargeArraySize(size);
312 }
313};
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318} // namespace Arcane
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322
323namespace Arccore::impl
324{
325using Arcane::Impl::arccoreCheckIsPositive;
326using Arcane::Impl::arccoreCheckIsValidInt64;
327using Arcane::Impl::arccoreCheckIsValidInteger;
328using Arcane::Impl::arccoreThrowNegativeSize;
329using Arcane::Impl::arccoreThrowTooBigInt64;
330using Arcane::Impl::arccoreThrowTooBigInteger;
331using Arcane::Impl::areEqual;
332using Arcane::Impl::areEqual2D;
333using Arcane::Impl::dumpArray;
334using Arcane::Impl::subViewInterval;
335} // namespace Arccore::impl
336
337namespace Arccore
338{
341} // namespace Arccore
342
343/*---------------------------------------------------------------------------*/
344/*---------------------------------------------------------------------------*/
345
346#endif
#define ARCCORE_INTEGER_MAX
Macro indiquant la valeur maximal que peut prendre le type Integer.
Classe utilitaire pour afficher une vue de tableau sur un flux.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
constexpr __host__ __device__ Integer arccoreCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
constexpr __host__ __device__ Int64 arccoreCheckLargeArraySize(size_t size)
Vérifie que size peut être converti dans un 'Int64' pour servir de taille à un tableau.
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nom de Arccore.