Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemEnumeratorBase.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/* ItemEnumeratorBase.h (C) 2000-2024 */
9/* */
10/* Classe de base des énumérateurs sur les entités du maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_ITEMENUMERATORBASE_H
13#define ARCANE_CORE_ITEMENUMERATORBASE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/ItemInternalEnumerator.h"
18#include "arcane/core/Item.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29class ItemEnumeratorCS;
30class ItemGroupImpl;
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34/*!
35 * \brief Représente un index d'une énumération sur une entité.
36 */
38{
39 public:
40
41 ItemEnumeratorIndex() = default;
42 constexpr ARCCORE_HOST_DEVICE explicit ItemEnumeratorIndex(Int32 index)
43 : m_index(index)
44 {}
45 constexpr ARCCORE_HOST_DEVICE Int32 index() const { return m_index; }
46 constexpr ARCCORE_HOST_DEVICE Int32 asInt32() const { return m_index; }
47
48 private:
49
50 Int32 m_index = -1;
51};
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55/*!
56 * \brief Représente un index d'une énumération sur une entité \a ItemType.
57 */
58template <typename ItemType>
61{
62 public:
63
64 ItemEnumeratorIndexT() = default;
65 constexpr ARCCORE_HOST_DEVICE explicit ItemEnumeratorIndexT(Int32 index)
66 : ItemEnumeratorIndex(index)
67 {}
68};
69
70/*---------------------------------------------------------------------------*/
71/*---------------------------------------------------------------------------*/
72/*!
73 * \brief Classe de base des énumérateurs sur une liste d'entité.
74 *
75 * Les instances de cette classes sont créées soit via ItemEnumerator, soit
76 * via ItemEnumeratorT.
77 */
79{
80 private:
81
83
84 protected:
85
86 ItemEnumeratorBase() = default;
87 ItemEnumeratorBase(const ItemInternalPtr*, const Int32* local_ids, Integer n, const ItemGroupImpl* agroup)
88 // TODO: gérer offset
89 : m_view(local_ids, n, 0)
90 , m_group_impl(agroup)
91 {}
92 explicit ItemEnumeratorBase(const Int32ConstArrayView& local_ids)
93 // TODO: gérer offset
94 : m_view(local_ids, 0)
95 , m_group_impl(nullptr)
96 {}
97 ItemEnumeratorBase(const Int32ConstArrayView& local_ids, const ItemGroupImpl* agroup)
98 // TODO: gérer offset
99 : m_view(local_ids, 0)
100 , m_group_impl(agroup)
101 {}
102 // TODO: A supprimer
104 : m_view(view.localIds(), view.m_local_id_offset)
105 , m_group_impl(agroup)
106 {}
108 : m_view(rhs.localIds(), rhs._localIdOffset())
109 {}
110 template <int E> ItemEnumeratorBase(const ItemConnectedListView<E>& rhs)
111 : m_view(rhs._localIds(), rhs._localIdOffset())
112 {}
113
115
116 public:
117
118 //! Incrémente l'index de l'énumérateur
119 constexpr void operator++() { ++m_index; }
120 constexpr bool operator()() { return m_index < m_view.m_size; }
121
122 //! Vrai si on n'a pas atteint la fin de l'énumérateur (index()<count())
123 constexpr bool hasNext() { return m_index < m_view.m_size; }
124
125 //! Nombre d'éléments de l'énumérateur
126 constexpr Integer count() const { return m_view.m_size; }
127
128 //! Indice courant de l'énumérateur
129 constexpr Integer index() const { return m_index; }
130
131 //! localId() de l'entité courante.
132 Int32 itemLocalId() const { return m_view.localId(m_index); }
133
134 //! localId() de l'entité courante.
135 Int32 localId() const { return m_view.localId(m_index); }
136
137 /*!
138 * \internal
139 * \brief Indices locaux.
140 */
141 ARCANE_DEPRECATED_REASON("Y2022: This method is internal to Arcane")
142 constexpr const Int32* unguardedLocalIds() const { return m_view.m_local_ids; }
143
144 /*!
145 * \brief Groupe sous-jacent s'il existe (nullptr sinon)
146 *
147 * \brief Ceci vise à pouvoir tester que les accès par ce énumérateur sur un objet partiel sont licites.
148 */
149 constexpr const ItemGroupImpl* group() const { return m_group_impl; }
150
151 static constexpr int version() { return 3; }
152
153 protected:
154
155 impl::ItemLocalIdListContainerView m_view;
156 Int32 m_index = 0;
157 const ItemGroupImpl* m_group_impl = nullptr; // pourrait être retiré en mode release si nécessaire
158
159 protected:
160
161 //! Constructeur seulement utilisé par fromItemEnumerator()
162 ItemEnumeratorBase(const ItemEnumerator& rhs, bool);
163
164 ItemEnumeratorBase(const impl::ItemLocalIdListContainerView& view, Int32 index, const ItemGroupImpl* agroup)
165 : m_view(view)
166 , m_index(index)
167 , m_group_impl(agroup)
168 {
169 }
170
171 explicit ItemEnumeratorBase(const impl::ItemLocalIdListContainerView& view)
172 : m_view(view)
173 {
174 }
175
176 ItemInternal* _internal(ItemSharedInfo* si) const
177 {
178 return si->m_items_internal[m_view.localId(m_index)];
179 }
180 constexpr const ItemInternalPtr* _unguardedItems(ItemSharedInfo* si) const
181 {
182 return si->m_items_internal.data();
183 }
184
185 private:
186};
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190/*!
191 * \brief Classe de base des énumérateurs sur une liste d'entité.
192 *
193 * Les instances de cette classes sont créées soit via ItemEnumerator, soit
194 * via ItemEnumeratorT.
195 */
196template <typename ItemType>
198: public ItemEnumeratorBase
199{
200 friend class SimdItemEnumeratorBase;
201
202 private:
203
205 using LocalIdType = typename ItemType::LocalIdType;
207
208 protected:
209
211 : BaseClass()
212 , m_item(NULL_ITEM_LOCAL_ID, ItemSharedInfo::nullInstance())
213 {}
214 // TODO: gérer offset
215 ItemEnumeratorBaseT(ItemSharedInfo* shared_info, const Int32ConstArrayView& local_ids)
216 : BaseClass(local_ids)
217 , m_item(NULL_ITEM_LOCAL_ID, shared_info)
218 {}
219 // TODO: gérer offset
220 ItemEnumeratorBaseT(const ItemInfoListView& items, const Int32ConstArrayView& local_ids, const ItemGroupImpl* agroup)
221 : BaseClass(local_ids, agroup)
222 , m_item(NULL_ITEM_LOCAL_ID, items.m_item_shared_info)
223 {}
225 : BaseClass(view, agroup)
226 , m_item(NULL_ITEM_LOCAL_ID, view.m_shared_info)
227 {}
229 : ItemEnumeratorBaseT((const ItemInternalVectorView&)rhs, nullptr)
230 {}
232 : ItemEnumeratorBaseT((const ItemInternalVectorView&)rhs, nullptr)
233 {}
234
237 : ItemEnumeratorBaseT(view.m_shared_info, view.constLocalIds())
238 {}
239
241 : BaseClass(rhs)
242 , m_item(NULL_ITEM_LOCAL_ID, rhs.m_shared_info)
243 {}
244
246 : BaseClass(view)
247 , m_item(NULL_ITEM_LOCAL_ID, si)
248 {
249 }
250
251 protected:
252
253 // TODO: a supprimer
254 ItemEnumeratorBaseT(const ItemInternalPtr* items, const Int32* local_ids, Integer n, const ItemGroupImpl* agroup)
255 : BaseClass(items, local_ids, n, agroup)
256 {
257 _init(items);
258 }
259 // TODO: a supprimer
260 ItemEnumeratorBaseT(const ItemInternalArrayView& items, const Int32ConstArrayView& local_ids, const ItemGroupImpl* agroup)
261 : BaseClass(local_ids, agroup)
262 {
263 _init(items.data());
264 }
265 // TODO: a supprimer
267
268 public:
269
270 /*!
271 * \internal
272 * \brief Liste des ItemInternal.
273 * NOTE: Dans Arcane, méthode utilisée uniquement pour le wrapper C#. A supprimer ensuite
274 */
275 ARCANE_DEPRECATED_REASON("Y2022: This method is internal to Arcane")
276 constexpr const ItemInternalPtr* unguardedItems() const { return _unguardedItems(m_item.m_shared_info); }
277
278 /*!
279 * \internal
280 * \brief Partie interne (pour usage interne uniquement).
281 */
282 ARCANE_DEPRECATED_REASON("Y2022: This method is internal to Arcane")
283 constexpr ItemInternal* internal() const { return _internal(m_item.m_shared_info); }
284
285 public:
286
287 constexpr ItemType operator*() const
288 {
289 m_item.m_local_id = m_view.localId(m_index);
290 return m_item;
291 }
292 constexpr const ItemType* operator->() const
293 {
294 m_item.m_local_id = m_view.localId(m_index);
295 return &m_item;
296 }
297
298 constexpr LocalIdType asItemLocalId() const
299 {
300 return LocalIdType{ m_view.localId(m_index) };
301 }
302
303 constexpr operator LocalIdType() const
304 {
305 return LocalIdType{ m_view.localId(m_index) };
306 }
307
308 ItemEnumerator toItemEnumerator() const;
309
310 public:
311
312 impl::ItemBase _internalItemBase() const { return m_item.itemBase(); }
313
314 protected:
315
316 mutable ItemType m_item = ItemType(NULL_ITEM_LOCAL_ID, nullptr);
317
318 protected:
319
320 //! Constructeur seulement utilisé par fromItemEnumerator()
321 ItemEnumeratorBaseT(const ItemEnumerator& rhs, bool);
322
324 const ItemGroupImpl* agroup, Item item_base)
325 : ItemEnumeratorBase(view, index, agroup)
326 , m_item(item_base)
327 {
328 }
329
330 void _init(const ItemInternalPtr* items)
331 {
332 m_item.m_shared_info = ItemInternalCompatibility::_getSharedInfo(items, count());
333 }
334};
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
339} // End namespace Arcane
340
341/*---------------------------------------------------------------------------*/
342/*---------------------------------------------------------------------------*/
343
344#endif
Classe de base pour les entités du maillage.
Vue sur une liste d'entités connectées à une autre.
Vue sur une liste d'entités connectées à une autre entité.
Classe de base des énumérateurs sur une liste d'entité.
Classe de base des énumérateurs sur une liste d'entité.
Int32 localId() const
localId() de l'entité courante.
Int32 itemLocalId() const
localId() de l'entité courante.
constexpr Integer count() const
Nombre d'éléments de l'énumérateur.
constexpr const ItemGroupImpl * group() const
Groupe sous-jacent s'il existe (nullptr sinon)
constexpr bool hasNext()
Vrai si on n'a pas atteint la fin de l'énumérateur (index()<count())
constexpr void operator++()
Incrémente l'index de l'énumérateur.
constexpr Integer index() const
Indice courant de l'énumérateur.
Représente un index d'une énumération sur une entité ItemType.
Représente un index d'une énumération sur une entité.
Enumérateur sur une liste d'entités.
Vue sur une liste pour obtenir des informations sur les entités.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Classe de base d'un élément de maillage.
Definition Item.h:83
Classe de base des énumérateurs sur les entités vectortielles (SimdItem).
Definition SimdItem.h:376
Vue constante d'un tableau de type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-