Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemEnumerator.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* ItemEnumerator.h (C) 2000-2025 */
9/* */
10/* Enumérateur sur des groupes d'entités du maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_ITEMENUMERATOR_H
13#define ARCANE_CORE_ITEMENUMERATOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/ItemInternalEnumerator.h"
18#include "arcane/core/Item.h"
19#include "arcane/core/EnumeratorTraceWrapper.h"
20#include "arcane/core/IItemEnumeratorTracer.h"
21#include "arcane/core/ItemEnumeratorBase.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26/*!
27 * \file ItemEnumerator.h
28 *
29 * \brief Types et macros pour itérer sur les entités du maillage.
30 *
31 * Ce fichier contient les différentes types d'itérateur et les macros
32 * pour itérer sur les entités du maillage.
33 */
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37namespace Arcane
38{
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43class ItemEnumeratorCS;
44class ItemGroupImpl;
46
47// Cette méthode est réservée pour SWIG
48extern "C++" ARCANE_CORE_EXPORT
49void _arcaneInternalItemEnumeratorSwigSet(const ItemEnumerator* ie, ItemEnumeratorPOD* vpod);
50
51/*---------------------------------------------------------------------------*/
52/*---------------------------------------------------------------------------*/
53/*!
54 * \brief Enumérateur sur une liste d'entités.
55 */
56class ItemEnumerator
57: public ItemEnumeratorBaseT<Item>
58{
59 friend class ItemEnumeratorCS;
60 friend class ItemGroup;
61 friend class ItemVector;
62 friend class ItemVectorView;
63 friend class ItemPairEnumerator;
64 template<int Extent> friend class ItemConnectedListView;
65 // NOTE: Normalement il suffirait de faire cela:
66 // template<class T> friend class ItemEnumeratorBase;
67 // mais cela ne fonctionne pas avec GCC 8. On fait donc la spécialisation
68 // à la main
69 //template<class T> friend class ItemEnumeratorBaseT;
70 friend class ItemEnumeratorBaseT<Item>;
71 friend class ItemEnumeratorBaseT<Node>;
72 friend class ItemEnumeratorBaseT<ItemWithNodes>;
73 friend class ItemEnumeratorBaseT<Edge>;
74 friend class ItemEnumeratorBaseT<Face>;
75 friend class ItemEnumeratorBaseT<Cell>;
76 friend class ItemEnumeratorBaseT<Particle>;
77 friend class ItemEnumeratorBaseT<DoF>;
78 friend ARCANE_CORE_EXPORT void _arcaneInternalItemEnumeratorSwigSet(const ItemEnumerator* ie, ItemEnumeratorPOD* vpod);
79
80 public:
81
82 typedef ItemInternal* ItemInternalPtr;
83 using BaseClass = ItemEnumeratorBaseT<Item>;
84
85 public:
86
87 ItemEnumerator() = default;
88
89 ItemEnumerator(const ItemInternalVectorView& view)
90 : BaseClass(view, nullptr)
91 {}
92
93 ItemEnumerator(const ItemInternalEnumerator& rhs)
94 : BaseClass(rhs, true)
95 {}
96
97 ItemEnumerator(const impl::ItemIndexedListView<DynExtent>& rhs)
98 : BaseClass(rhs)
99 {}
100
101 public:
102
103 // Pour test
104 template<int E> ItemEnumerator(const ItemConnectedListView<E>& rhs)
105 : BaseClass(ItemConnectedListViewT<Item,E>(rhs)){}
106
107 private:
108
109 // Constructeur réservé pour ItemGroup
110 ItemEnumerator(const ItemInfoListView& items, const Int32ConstArrayView& local_ids, const ItemGroupImpl* agroup = nullptr)
111 : BaseClass(items, local_ids, agroup)
112 {}
113
114 public:
115
116 ARCANE_DEPRECATED_REASON("Y2022: Internal to Arcane. Use other constructor")
117 ItemEnumerator(const ItemInternalPtr* items, const Int32* local_ids, Integer n, const ItemGroupImpl* agroup = nullptr)
118 : BaseClass(items, local_ids, n, agroup)
119 {}
120
121 ARCANE_DEPRECATED_REASON("Y2022: Internal to Arcane. Use other constructor")
122 ItemEnumerator(const ItemInternalArrayView& items, const Int32ConstArrayView& local_ids, const ItemGroupImpl* agroup = nullptr)
123 : BaseClass(items, local_ids, agroup)
124 {}
125
126 ARCANE_DEPRECATED_REASON("Y2022: Internal to Arcane. Use other constructor")
127 ItemEnumerator(const ItemInternalVectorView& view, const ItemGroupImpl* agroup)
128 : BaseClass(view, agroup)
129 {}
130
131 protected:
132
133 // TODO A supprimer
134 ItemEnumerator(ItemSharedInfo* s, const Int32ConstArrayView& local_ids)
135 : BaseClass(s, local_ids)
136 {}
137
138 ItemEnumerator(ItemSharedInfo* s, const impl::ItemLocalIdListContainerView& view)
139 : BaseClass(s, view)
140 {}
141
142 public:
143
144 static ItemEnumerator fromItemEnumerator(const ItemEnumerator& rhs)
145 {
146 return ItemEnumerator(rhs);
147 }
148
149 private:
150
151 ItemEnumerator(const impl::ItemLocalIdListContainerView& view, Int32 index,
152 const ItemGroupImpl* agroup, Item item_base)
153 : BaseClass(view, index, agroup, item_base)
154 {}
155 ItemSharedInfo* _sharedInfo() const { return _internalItemBase().m_shared_info; }
156};
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164//! Constructeur seulement utilisé par fromItemEnumerator()
165inline ItemEnumeratorBase::
166ItemEnumeratorBase(const ItemEnumerator& rhs, bool)
167: m_view(rhs.m_view)
168, m_index(rhs.index())
169, m_group_impl(rhs.group())
170{
171}
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
175
176//! Constructeur seulement utilisé par fromItemEnumerator()
177template<typename ItemType> inline ItemEnumeratorBaseT<ItemType>::
178ItemEnumeratorBaseT(const ItemEnumerator& rhs,bool v)
179: ItemEnumeratorBase(rhs,v)
180, m_item(rhs._internalItemBase())
181{
182}
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
186
187inline ItemEnumeratorBase::
188ItemEnumeratorBase(const ItemEnumerator& rhs)
189: m_view(rhs.m_view)
190, m_index(rhs.index())
191, m_group_impl(rhs.group())
192{
193}
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
197
198template<typename ItemType> inline ItemEnumeratorBaseT<ItemType>::
199ItemEnumeratorBaseT(const ItemEnumerator& rhs)
200: ItemEnumeratorBase(rhs)
201, m_item(rhs._internalItemBase())
202{
203}
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
208template<typename ItemType> inline ItemEnumeratorBaseT<ItemType>::
211{
212}
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
217template<typename ItemType> inline ItemEnumerator ItemEnumeratorBaseT<ItemType>::
218toItemEnumerator() const
219{
220 return ItemEnumerator(m_view,m_index,m_group_impl,m_item);
221}
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228/*!
229 * \brief Enumérateur sur une liste typée d'entités de type \a ItemType
230 */
231template<typename ItemType>
232class ItemEnumeratorT
233: public ItemEnumeratorBaseT<ItemType>
234{
235 private:
236
237 using ItemInternalPtr = ItemInternal*;
238 using LocalIdType = typename ItemType::LocalIdType;
239 using BaseClass = ItemEnumeratorBaseT<ItemType>;
240 friend class ItemVectorT<ItemType>;
241 friend class ItemVectorViewT<ItemType>;
242 friend class ItemConnectedListViewT<ItemType>;
243 friend class SimdItemEnumeratorT<ItemType>;
244 template <typename I1, typename I2> friend class ItemPairEnumeratorT;
245
246 public:
247
248 ItemEnumeratorT() = default;
249 ItemEnumeratorT(const ItemVectorView& rhs) : BaseClass(rhs){}
250 ItemEnumeratorT(const ItemVectorViewT<ItemType>& rhs) : BaseClass(rhs){}
251
252 public:
253
254 [[deprecated("Y2021: Use strongly typed enumerator (Node, Face, Cell, ...) instead of generic (Item) enumerator")]]
255 ItemEnumeratorT(const ItemEnumerator& rhs)
256 : BaseClass(rhs){}
257
258 [[deprecated("Y2021: Use strongly typed enumerator (Node, Face, Cell, ...) instead of generic (Item) enumerator")]]
259 ItemEnumeratorT(const ItemInternalEnumerator& rhs)
260 : BaseClass(rhs){}
261
262 public:
263
264 ARCANE_DEPRECATED_REASON("Y2022: Internal to Arcane. Use other constructor")
265 ItemEnumeratorT(const ItemInternalPtr* items,const Int32* local_ids,Integer n, const ItemGroupImpl* agroup = nullptr)
266 : BaseClass(items,local_ids,n,agroup){}
267
268 ARCANE_DEPRECATED_REASON("Y2022: Internal to Arcane. Use other constructor")
269 ItemEnumeratorT(const ItemInternalArrayView& items,const Int32ConstArrayView& local_ids, const ItemGroupImpl* agroup = nullptr)
270 : BaseClass(items,local_ids,agroup){}
271
272 ARCANE_DEPRECATED_REASON("Y2022: Internal to Arcane. Use other constructor")
273 ItemEnumeratorT(const ItemInternalVectorView& view, const ItemGroupImpl* agroup = nullptr)
274 : BaseClass(view,agroup){}
275
276 public:
277
278 // Pour test
279 ItemEnumeratorT(const ItemConnectedListViewT<ItemType>& rhs) : BaseClass(rhs){}
280
281 private:
282
283 // Constructeur réservé pour ItemGroup
284 ItemEnumeratorT(const ItemInfoListViewT<ItemType>& items, const Int32ConstArrayView& local_ids, const ItemGroupImpl* agroup = nullptr)
285 : BaseClass(items, local_ids, agroup)
286 {}
287
288 private:
289
290 // TODO: a supprimer
291 ItemEnumeratorT(ItemSharedInfo* s,const Int32ConstArrayView& local_ids)
292 : BaseClass(s,local_ids){}
293
294 ItemEnumeratorT(ItemSharedInfo* s,const impl::ItemLocalIdListContainerView& view)
295 : BaseClass(s,view){}
296
297 public:
298
299 //! Conversion vers un ItemEnumerator
300 operator ItemEnumerator() const { return this->toItemEnumerator(); }
301
302 public:
303
304 static ItemEnumeratorT<ItemType> fromItemEnumerator(const ItemEnumerator& rhs)
305 {
306 return ItemEnumeratorT<ItemType>(rhs,true);
307 }
308
309 private:
310
311 //! Constructeur seulement utilisé par fromItemEnumerator()
312 ItemEnumeratorT(const ItemEnumerator& rhs,bool v) : BaseClass(rhs,v){}
313};
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318inline ItemEnumerator ItemVectorView::
319enumerator() const
320{
321 return ItemEnumerator(m_shared_info,m_index_view._localIds());
322}
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
327template<int Extent>
329enumerator() const
330{
331 return ItemEnumerator(m_shared_info,m_index_view._localIds());
332}
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
337template<typename ItemType> inline ItemLocalId::
338ItemLocalId(ItemEnumeratorT<ItemType> enumerator)
339: m_local_id(enumerator.asItemLocalId())
340{
341}
342
343/*---------------------------------------------------------------------------*/
344/*---------------------------------------------------------------------------*/
345
346inline ItemLocalId::
347ItemLocalId(ItemConnectedEnumerator enumerator)
348: m_local_id(enumerator.asItemLocalId())
349{
350}
351
352/*---------------------------------------------------------------------------*/
353/*---------------------------------------------------------------------------*/
354
355template<typename ItemType> inline ItemLocalId::
356ItemLocalId(ItemConnectedEnumeratorT<ItemType> enumerator)
357: m_local_id(enumerator.asItemLocalId())
358{
359}
360
361/*---------------------------------------------------------------------------*/
362/*---------------------------------------------------------------------------*/
363
364// TODO: ajouter vérification du bon type
365template<typename ItemType> inline ItemLocalIdT<ItemType>::
367: ItemLocalId(enumerator.asItemLocalId())
368{
369}
370
371/*---------------------------------------------------------------------------*/
372/*---------------------------------------------------------------------------*/
373
374template<typename ItemType> inline ItemLocalIdT<ItemType>::
376: ItemLocalId(enumerator.asItemLocalId())
377{
378}
379
380/*---------------------------------------------------------------------------*/
381/*---------------------------------------------------------------------------*/
382
383} // End namespace
384
385/*---------------------------------------------------------------------------*/
386/*---------------------------------------------------------------------------*/
387
388#define ARCANE_CHECK_ENUMERATOR(enumerator,testgroup) \
389 ARCANE_ASSERT(((enumerator).group()==(testgroup).internal()),("Invalid access on partial data using enumerator not associated to underlying group %s",testgroup.name().localstr()))
390
391/*---------------------------------------------------------------------------*/
392/*---------------------------------------------------------------------------*/
393
394#define A_ENUMERATE_ITEM(_EnumeratorClassName,iname,view) \
395 for( A_TRACE_ITEM_ENUMERATOR(_EnumeratorClassName) iname(_EnumeratorClassName :: fromItemEnumerator((view).enumerator()) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname )
396
397#define A_ENUMERATE_ITEM_NO_TRACE(_EnumeratorClassName,iname,view) \
398 for( _EnumeratorClassName iname(_EnumeratorClassName :: fromItemEnumerator((view).enumerator())); iname.hasNext(); ++iname )
399
400/*---------------------------------------------------------------------------*/
401/*---------------------------------------------------------------------------*/
402
403//! Enumérateur générique d'un groupe d'entité
404#define ENUMERATE_NO_TRACE_(type,name,group) A_ENUMERATE_ITEM_NO_TRACE(::Arcane::ItemEnumeratorT< type >,name,group)
405
406//! Enumérateur générique d'un groupe d'entité
407#define ENUMERATE_(type,name,group) A_ENUMERATE_ITEM(::Arcane::ItemEnumeratorT< type >,name,group)
408
409//! Enumérateur générique d'un groupe d'entité
410#define ENUMERATE_GENERIC(type,name,group) A_ENUMERATE_ITEM(::Arcane::ItemEnumeratorT< type >,name,group)
411
412//! Enumérateur générique d'un groupe de noeuds
413#define ENUMERATE_ITEM(name,group) A_ENUMERATE_ITEM(::Arcane::ItemEnumerator,name,group)
414
415#define ENUMERATE_ITEMWITHNODES(name,group) ENUMERATE_(::Arcane::ItemWithNodes,name,group)
416
417//! Enumérateur générique d'un groupe de noeuds
418#define ENUMERATE_NODE(name,group) ENUMERATE_(::Arcane::Node,name,group)
419
420//! Enumérateur générique d'un groupe d'arêtes
421#define ENUMERATE_EDGE(name,group) ENUMERATE_(::Arcane::Edge,name,group)
422
423//! Enumérateur générique d'un groupe de faces
424#define ENUMERATE_FACE(name,group) ENUMERATE_(::Arcane::Face,name,group)
425
426//! Enumérateur générique d'un groupe de mailles
427#define ENUMERATE_CELL(name,group) ENUMERATE_(::Arcane::Cell,name,group)
428
429//! Enumérateur générique d'un groupe de particules
430#define ENUMERATE_PARTICLE(name,group) ENUMERATE_(::Arcane::Particle,name,group)
431
432//! Enumérateur generique d'un groupe de degrés de liberté
433#define ENUMERATE_DOF(name,group) ENUMERATE_(::Arcane::DoF,name,group)
434
435/*---------------------------------------------------------------------------*/
436/*---------------------------------------------------------------------------*/
437
438/*!
439 * \brief Enumérateur sur un ItemPairGroup.
440 * \param _item_type1 Type de l'entité du groupe
441 * \param _item_type2 Type des sous-entités du groupe
442 * \param _name Nom de l'énumérateur
443 * \param _group Instance de ItemPairGroup
444 */
445#define ENUMERATE_ITEMPAIR(_item_type1,_item_type2,_name,_array) \
446for( ::Arcane::ItemPairEnumeratorT< _item_type1, _item_type2 > _name(_array); _name.hasNext(); ++_name )
447
448/*!
449 * \brief Enumérateur générique sur un ItemPairGroup.
450 * \sa ENUMERATE_ITEMPAIR
451 */
452#define ENUMERATE_ITEMPAIR_DIRECT(_name,_array) \
453for( ::Arcane::ItemPairEnumerator _name(_array); _name.hasNext(); ++_name )
454
455/*---------------------------------------------------------------------------*/
456/*---------------------------------------------------------------------------*/
457
458/*!
459 * \brief Enumérateur sur sous-élément d'un ItemPairGroup.
460 * \param _item_type Type de la sous-entité
461 * \param _name Nom de l'énumérateur
462 * \param _parent_item Instance de l'entité parente ou de l'énumérateur
463 * sur l'entité parente.
464 */
465#define ENUMERATE_SUB_ITEM(_item_type,_name,_parent_item) \
466for( ::Arcane::ItemEnumeratorT< _item_type > _name(_parent_item.subItems()); _name.hasNext(); ++_name )
467
468/*!
469 * \brief Enumérateur générique sur un sous-élément d'un ItemPairGroup.
470 * \sa ENUMERATE_SUB_ITEM
471 */
472#define ENUMERATE_SUB_ITEM_DIRECT(_name,_parent_item) \
473for( ::Arcane::ItemInternalEnumerator _name(_parent_item.subItems()); _name.hasNext(); ++_name )
474
475/*---------------------------------------------------------------------------*/
476/*---------------------------------------------------------------------------*/
477
478#endif
Types et macros pour itérer sur les entités du maillage connectées à une autre entité.
Maille d'un maillage.
Definition Item.h:1191
classe degré de liberté.
Definition Item.h:1503
Arête d'une maille.
Definition Item.h:809
Face d'une maille.
Definition Item.h:944
Enumérateur sur une liste typée d'entités connectées de type ItemType.
Enumérateur sur une liste d'entités connectées à une autre.
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é.
constexpr const ItemGroupImpl * group() const
Groupe sous-jacent s'il existe (nullptr sinon)
constexpr Integer index() const
Indice courant de l'énumérateur.
Enumérateur sur une liste typée d'entités de type ItemType.
Enumérateur sur une liste d'entités.
Classe de base des vues spécialisées des informations sur les entités.
Vue sur une liste pour obtenir des informations sur les entités.
Index d'une entité ItemType dans une variable.
Definition ItemLocalId.h:90
Index d'un Item dans une variable.
Definition ItemLocalId.h:41
Vecteur typé d'entité.
Definition ItemVector.h:166
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Definition Item.h:724
Classe de base d'un élément de maillage.
Definition Item.h:83
Noeud d'un maillage.
Definition Item.h:573
Particule.
Definition Item.h:1397
Enumérateur sur une liste d'entités.
Definition SimdItem.h:429
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
std::int32_t Int32
Type entier signé sur 32 bits.