Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MDDim.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* MDDim.h (C) 2000-2024 */
9/* */
10/* Tag pour les tableaux N-dimensions. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_MDDIM_H
13#define ARCANE_UTILS_MDDIM_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19/*
20 * ATTENTION:
21 *
22 * Toutes les classes de ce fichier sont expérimentales et l'API n'est pas
23 * figée. A NE PAS UTILISER EN DEHORS DE ARCANE.
24 */
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30namespace impl::extent
31{
32 template <class... Int32> constexpr int doSum(Int32... x)
33 {
34 return (x + ...);
35 }
36 constexpr int oneIfDynamic(Int32 x)
37 {
38 return ((x == DynExtent) ? 1 : 0);
39 }
40 // Nombre de valeurs dynamiques dans la liste des arguments
41 // Un argument est dynamique s'il vaut Arcane::DynExtent
42 template <class... Int32> constexpr int nbDynamic(Int32... args)
43 {
44 return doSum(oneIfDynamic(args)...);
45 }
46} // namespace impl::extent
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50/*!
51 * \brief Spécialisation pour les dimensions des tableaux à 0 dimensions.
52 */
53template <typename IndexType_>
54class ExtentsV<IndexType_>
55{
56 public:
57
59
60 static constexpr int rank() { return 0; }
61 static constexpr int nb_dynamic = 0;
62
63 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X>;
64 template <int X, int Last> using AddedFirstLastExtentsType = ExtentsV<IndexType_, X, Last>;
65 template <int X, int Last1, int Last2> using AddedFirstLastLastExtentsType = ExtentsV<IndexType_, X, Last1, Last2>;
66};
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70/*!
71 * \brief Spécialisation pour les dimensions des tableaux à 1 dimension.
72 */
73template <typename IndexType_, Int32 X0>
74class ExtentsV<IndexType_, X0>
75{
76 public:
77
78 static constexpr int rank() { return 1; }
79 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0);
80 static constexpr bool is_full_dynamic() { return (nb_dynamic == 1); }
81
82 using MDIndexType = MDIndex<1>;
85 using DynamicDimsType = MDIndex<nb_dynamic>;
86 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X, X0>;
87 template <int X, int Last> using AddedFirstLastExtentsType = ExtentsV<IndexType_, X, X0, Last>;
88 template <int X, int Last1, int Last2> using AddedFirstLastLastExtentsType = ExtentsV<IndexType_, X, X0, Last1, Last2>;
89
90 // TODO: rendre obsolète (mi-2024). Utiliser MDIndexType à la place
91 using IndexType = ArrayIndex<1>;
92};
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96/*!
97 * \brief Spécialisation pour les dimensions des tableaux à 2 dimensions.
98 */
99template <typename IndexType_, Int32 X0, Int32 X1>
100class ExtentsV<IndexType_, X0, X1>
101{
102 public:
103
104 static constexpr int rank() { return 2; }
105 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0, X1);
106 static constexpr bool is_full_dynamic() { return (nb_dynamic == 2); }
107
108 using MDIndexType = MDIndex<2>;
110 using RemovedFirstExtentsType = ExtentsV<IndexType_, X1>;
111 using DynamicDimsType = MDIndex<nb_dynamic>;
112 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X, X0, X1>;
113 template <int X, int Last> using AddedFirstLastExtentsType = ExtentsV<IndexType_, X, X0, X1, Last>;
114
115 // TODO: rendre obsolète (mi-2024). Utiliser MDIndexType à la place
116 using IndexType = ArrayIndex<2>;
117};
118
119/*---------------------------------------------------------------------------*/
120/*---------------------------------------------------------------------------*/
121/*!
122 * \brief Spécialisation pour les dimensions des tableaux à 3 dimensions.
123 */
124template <typename IndexType_, Int32 X0, Int32 X1, Int32 X2>
125class ExtentsV<IndexType_, X0, X1, X2>
126{
127 public:
128
129 static constexpr int rank() { return 3; }
130 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0, X1, X2);
131 static constexpr bool is_full_dynamic() { return (nb_dynamic == 3); }
132
133 using MDIndexType = MDIndex<3>;
135 using RemovedFirstExtentsType = ExtentsV<IndexType_, X1, X2>;
136 using DynamicDimsType = MDIndex<nb_dynamic>;
137 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X, X0, X1, X2>;
138
139 // TODO: rendre obsolète (mi-2024). Utiliser MDIndexType à la place
140 using IndexType = MDIndex<3>;
141};
142
143/*---------------------------------------------------------------------------*/
144/*---------------------------------------------------------------------------*/
145/*!
146 * \brief Spécialisation pour les dimensions des tableaux à 4 dimensions.
147 */
148template <typename IndexType_, Int32 X0, Int32 X1, Int32 X2, Int32 X3>
149class ExtentsV<IndexType_, X0, X1, X2, X3>
150{
151 public:
152
153 static constexpr int rank() { return 4; }
154 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0, X1, X2, X3);
155 static constexpr bool is_full_dynamic() { return (nb_dynamic == 4); }
156
157 using MDIndexType = MDIndex<4>;
159 using RemovedFirstExtentsType = ExtentsV<IndexType_, X1, X2, X3>;
160 using DynamicDimsType = MDIndex<nb_dynamic>;
161
162 // TODO: rendre obsolète (mi-2024). Utiliser MDIndexType à la place
163 using IndexType = MDIndex<4>;
164};
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
169//! Constante pour un tableau dynamique de rang 0
171
172//! Constante pour un tableau dynamique de rang 1
174
175//! Constante pour un tableau dynamique de rang 2
177
178//! Constante pour un tableau dynamique de rang 3
180
181//! Constante pour un tableau dynamique de rang 4
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
186
187template <>
188class MDDimType<0>
189{
190 public:
191
192 using DimType = MDDim0;
193};
194template <>
195class MDDimType<1>
196{
197 public:
198
199 using DimType = MDDim1;
200};
201template <>
202class MDDimType<2>
203{
204 public:
205
206 using DimType = MDDim2;
207};
208template <>
209class MDDimType<3>
210{
211 public:
212
213 using DimType = MDDim3;
214};
215template <>
216class MDDimType<4>
217{
218 public:
219
220 using DimType = MDDim4;
221};
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
225
226// Ces trois macros pourront être supprimées après la 3.8
227
228// A définir lorsqu'on voudra que le rang des classes NumArray et associées
229// soit spécifié par une classe au lieu d'un entier
230#define ARCANE_USE_TYPE_FOR_EXTENT
231#define A_MDRANK_TYPE(rank_name) typename rank_name
232#define A_MDRANK_RANK_VALUE(rank_name) (rank_name ::rank())
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
237} // End namespace Arcane
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242#endif
Déclarations des types utilisés dans Arcane.
Spécialisation pour les dimensions des tableaux à 0 dimensions.
Definition MDDim.h:55
Spécialisation pour contenir les dimensions d'un tableau à 4 dimensions.
Spécialisation pour contenir les dimensions d'un tableau à 3 dimensions.
Spécialisation pour contenir les dimensions d'un tableau à 2 dimensions.
Spécialisation pour contenir les dimensions d'un tableau à 1 dimension.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ExtentsV< Int32, DynExtent, DynExtent, DynExtent > MDDim3
Constante pour un tableau dynamique de rang 3.
Definition MDDim.h:179
constexpr Int32 DynExtent
Constante pour indiquer que la dimension d'un tableau est dynamique.
Definition UtilsTypes.h:255
ExtentsV< Int32, DynExtent, DynExtent, DynExtent, DynExtent > MDDim4
Constante pour un tableau dynamique de rang 4.
Definition MDDim.h:182
ExtentsV< Int32 > MDDim0
Constante pour un tableau dynamique de rang 0.
Definition MDDim.h:170
ExtentsV< Int32, DynExtent, DynExtent > MDDim2
Constante pour un tableau dynamique de rang 2.
Definition MDDim.h:176
ExtentsV< Int32, DynExtent > MDDim1
Constante pour un tableau dynamique de rang 1.
Definition MDDim.h:173