Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ExtentsV.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/* ExtentsV.h (C) 2000-2024 */
9/* */
10/* Tag pour les tableaux N-dimensions. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_EXTENTSV_H
13#define ARCANE_UTILS_EXTENTSV_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24namespace impl::extent
25{
26 template <class... Int32> constexpr int doSum(Int32... x)
27 {
28 return (x + ...);
29 }
30 constexpr int oneIfDynamic(Int32 x)
31 {
32 return ((x == DynExtent) ? 1 : 0);
33 }
34 // Nombre de valeurs dynamiques dans la liste des arguments
35 // Un argument est dynamique s'il vaut Arcane::DynExtent
36 template <class... Int32> constexpr int nbDynamic(Int32... args)
37 {
38 return doSum(oneIfDynamic(args)...);
39 }
40} // namespace impl::extent
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44/*!
45 * \brief Spécialisation pour les dimensions des tableaux à 0 dimensions.
46 */
47template <typename IndexType_>
48class ExtentsV<IndexType_>
49{
50 public:
51
53
54 static constexpr int rank() { return 0; }
55 static constexpr int nb_dynamic = 0;
56 static constexpr bool isDynamic1D() { return false; }
57
58 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X>;
59 template <int X, int Last> using AddedFirstLastExtentsType = ExtentsV<IndexType_, X, Last>;
60 template <int X, int Last1, int Last2> using AddedFirstLastLastExtentsType = ExtentsV<IndexType_, X, Last1, Last2>;
61};
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65/*!
66 * \brief Spécialisation pour les dimensions des tableaux à 1 dimension.
67 */
68template <typename IndexType_, Int32 X0>
69class ExtentsV<IndexType_, X0>
70{
71 public:
72
73 static constexpr int rank() { return 1; }
74 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0);
75 static constexpr bool is_full_dynamic() { return (nb_dynamic == 1); }
76 static constexpr bool isDynamic1D() { return (nb_dynamic == 1); }
77
78 using MDIndexType = MDIndex<1>;
81 using DynamicDimsType = MDIndex<nb_dynamic>;
82 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X, X0>;
83 template <int X, int Last> using AddedFirstLastExtentsType = ExtentsV<IndexType_, X, X0, Last>;
84 template <int X, int Last1, int Last2> using AddedFirstLastLastExtentsType = ExtentsV<IndexType_, X, X0, Last1, Last2>;
85
86 using IndexType ARCANE_DEPRECATED_REASON("Use 'MDIndexType' instead") = ArrayIndex<1>;
87};
88
89/*---------------------------------------------------------------------------*/
90/*---------------------------------------------------------------------------*/
91/*!
92 * \brief Spécialisation pour les dimensions des tableaux à 2 dimensions.
93 */
94template <typename IndexType_, Int32 X0, Int32 X1>
95class ExtentsV<IndexType_, X0, X1>
96{
97 public:
98
99 static constexpr int rank() { return 2; }
100 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0, X1);
101 static constexpr bool is_full_dynamic() { return (nb_dynamic == 2); }
102 static constexpr bool isDynamic1D() { return false; }
103
104 using MDIndexType = MDIndex<2>;
106 using RemovedFirstExtentsType = ExtentsV<IndexType_, X1>;
107 using DynamicDimsType = MDIndex<nb_dynamic>;
108 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X, X0, X1>;
109 template <int X, int Last> using AddedFirstLastExtentsType = ExtentsV<IndexType_, X, X0, X1, Last>;
110
111 using IndexType ARCANE_DEPRECATED_REASON("Use 'MDIndexType' instead") = ArrayIndex<2>;
112};
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116/*!
117 * \brief Spécialisation pour les dimensions des tableaux à 3 dimensions.
118 */
119template <typename IndexType_, Int32 X0, Int32 X1, Int32 X2>
120class ExtentsV<IndexType_, X0, X1, X2>
121{
122 public:
123
124 static constexpr int rank() { return 3; }
125 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0, X1, X2);
126 static constexpr bool is_full_dynamic() { return (nb_dynamic == 3); }
127 static constexpr bool isDynamic1D() { return false; }
128
129 using MDIndexType = MDIndex<3>;
131 using RemovedFirstExtentsType = ExtentsV<IndexType_, X1, X2>;
132 using DynamicDimsType = MDIndex<nb_dynamic>;
133 template <int X> using AddedFirstExtentsType = ExtentsV<IndexType_, X, X0, X1, X2>;
134
135 using IndexType ARCANE_DEPRECATED_REASON("Use 'MDIndexType' instead") = MDIndex<3>;
136};
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140/*!
141 * \brief Spécialisation pour les dimensions des tableaux à 4 dimensions.
142 */
143template <typename IndexType_, Int32 X0, Int32 X1, Int32 X2, Int32 X3>
144class ExtentsV<IndexType_, X0, X1, X2, X3>
145{
146 public:
147
148 static constexpr int rank() { return 4; }
149 static constexpr int nb_dynamic = impl::extent::nbDynamic(X0, X1, X2, X3);
150 static constexpr bool is_full_dynamic() { return (nb_dynamic == 4); }
151 static constexpr bool isDynamic1D() { return false; }
152
153 using MDIndexType = MDIndex<4>;
155 using RemovedFirstExtentsType = ExtentsV<IndexType_, X1, X2, X3>;
156 using DynamicDimsType = MDIndex<nb_dynamic>;
157
158 using IndexType ARCANE_DEPRECATED_REASON("Use 'MDIndexType' instead") = MDIndex<4>;
159};
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164} // End namespace Arcane
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
169#endif
Déclarations des types utilisés dans Arcane.
Spécialisation pour les dimensions des tableaux à 0 dimensions.
Definition ExtentsV.h:49
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 -*-
constexpr Int32 DynExtent
Constante pour indiquer que la dimension d'un tableau est dynamique.
Definition UtilsTypes.h:261