Arcane  v3.14.10.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-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/* ItemEnumerator.h (C) 2000-2024 */
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;
45class ItemEnumeratorPOD;
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 */
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>;
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 void _arcaneInternalItemEnumeratorSwigSet(const ItemEnumerator* ie, ItemEnumeratorPOD* vpod);
79
80 public:
81
84
85 public:
86
87 ItemEnumerator() = default;
88
90 : BaseClass(view, nullptr)
91 {}
92
94 : BaseClass(rhs, true)
95 {}
96
98 : BaseClass(rhs)
99 {}
100
101 public:
102
103 // Pour test
104 template<int E> ItemEnumerator(const ItemConnectedListView<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
135 : BaseClass(s, local_ids)
136 {}
137
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
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>::
209ItemEnumeratorBaseT(const ItemInternalEnumerator& rhs)
210: ItemEnumeratorBaseT(ItemEnumerator(rhs))
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>
233: public ItemEnumeratorBaseT<ItemType>
234{
235 private:
236
238 using LocalIdType = typename ItemType::LocalIdType;
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){}
251
252 public:
253
254 [[deprecated("Y2021: Use strongly typed enumerator (Node, Face, Cell, ...) instead of generic (Item) enumerator")]]
256 : BaseClass(rhs){}
257
258 [[deprecated("Y2021: Use strongly typed enumerator (Node, Face, Cell, ...) instead of generic (Item) enumerator")]]
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
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
292 : BaseClass(s,local_ids){}
293
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>::
366ItemLocalIdT(ItemEnumerator enumerator)
367: ItemLocalId(enumerator.asItemLocalId())
368{
369}
370
371/*---------------------------------------------------------------------------*/
372/*---------------------------------------------------------------------------*/
373
374template<typename ItemType> inline ItemLocalIdT<ItemType>::
375ItemLocalIdT(ItemConnectedEnumeratorT<ItemType> enumerator)
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:1178
classe degré de liberté.
Definition Item.h:1488
Arête d'une maille.
Definition Item.h:798
Face d'une maille.
Definition Item.h:932
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é.
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.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
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.
Enumérateur sur un tableau de tableaux d'entités du maillage de genre ItemType et SubItemType.
Enumérateur sur un tableau de tableaux d'entités du maillage.
Vecteur typé d'entité.
Definition ItemVector.h:166
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
Vecteur d'entités.
Definition ItemVector.h:59
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Definition Item.h:714
Classe de base d'un élément de maillage.
Definition Item.h:83
Noeud d'un maillage.
Definition Dom.h:204
Particule.
Definition Item.h:1383
Enumérateur sur une liste d'entités.
Definition SimdItem.h:429
Vue constante d'un tableau de type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-