Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemVectorView.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/* ItemVectorView.h (C) 2000-2024 */
9/* */
10/* Vue sur un vecteur (tableau indirect) d'entités. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_ITEMVECTORVIEW_H
13#define ARCANE_CORE_ITEMVECTORVIEW_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/ItemInternalVectorView.h"
18#include "arcane/core/ItemIndexArrayView.h"
19#include "arcane/core/ItemInfoListView.h"
20#include "arcane/core/ItemConnectedListView.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27// Pour le wrapper C#
28class ItemVectorViewPOD;
29namespace mesh
30{
31class IndexedItemConnectivityAccessor;
32}
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*!
36 * \internal
37 * \brief Itérateur pour la classe ItemVectorView.
38 *
39 * Cette classe est interne à Arcane. Elle s'utilise via le for-range:
40 *
41 * \code
42 * ItemVectorView view;
43 * for( Item item : view )
44 * ;
45 * \endcode
46 */
48{
49 protected:
50
51 friend class ItemVectorView;
52 template <int Extent> friend class ItemConnectedListView;
53
54 protected:
55
56 ItemVectorViewConstIterator(ItemSharedInfo* shared_info, const Int32* local_id_ptr, Int32 local_id_offset)
57 : m_shared_info(shared_info)
58 , m_local_id_ptr(local_id_ptr)
59 , m_local_id_offset(local_id_offset)
60 {}
61 ItemVectorViewConstIterator(ItemSharedInfo* shared_info, const Int32* local_id_ptr)
62 : m_shared_info(shared_info)
63 , m_local_id_ptr(local_id_ptr)
64 {}
65
66 public:
67
68 // Temporaire (01/2023) pour conversion avec nouveau type ItemConnectedListView
70 : m_shared_info(v.m_shared_info)
71 , m_local_id_ptr(v.m_local_id_ptr)
72 , m_local_id_offset(v.m_local_id_offset)
73 {}
74
75 public:
76
78 typedef std::random_access_iterator_tag iterator_category;
79 //! Type indexant le tableau
81 //! Type indexant le tableau
82 typedef Integer size_type;
83 //! Type d'une distance entre itérateur éléments du tableau
84 typedef std::ptrdiff_t difference_type;
85
86 public:
87
88 //TODO A supprimer avec le C++20
89 typedef const Item* pointer;
90 //TODO A supprimer avec le C++20
91 typedef const Item& reference;
92
93 public:
94
95 Item operator*() const { return Item(m_local_id_offset + (*m_local_id_ptr), m_shared_info); }
96
97 ThatClass& operator++()
98 {
99 ++m_local_id_ptr;
100 return (*this);
101 }
102 ThatClass& operator--()
103 {
104 --m_local_id_ptr;
105 return (*this);
106 }
107 void operator+=(difference_type v) { m_local_id_ptr += v; }
108 void operator-=(difference_type v) { m_local_id_ptr -= v; }
109 difference_type operator-(const ThatClass& b) const
110 {
111 return this->m_local_id_ptr - b.m_local_id_ptr;
112 }
113 friend ThatClass operator-(const ThatClass& a, difference_type v)
114 {
115 const Int32* ptr = a.m_local_id_ptr - v;
116 return ThatClass(a.m_shared_info, ptr, a.m_local_id_offset);
117 }
118 friend ThatClass operator+(const ThatClass& a, difference_type v)
119 {
120 const Int32* ptr = a.m_local_id_ptr + v;
121 return ThatClass(a.m_shared_info, ptr, a.m_local_id_offset);
122 }
123 friend bool operator<(const ThatClass& lhs, const ThatClass& rhs)
124 {
125 return lhs.m_local_id_ptr <= rhs.m_local_id_ptr;
126 }
127 //! Compare les indices d'itération de deux instances
128 friend bool operator==(const ThatClass& lhs, const ThatClass& rhs)
129 {
130 return lhs.m_local_id_ptr == rhs.m_local_id_ptr;
131 }
132 friend bool operator!=(const ThatClass& lhs, const ThatClass& rhs)
133 {
134 return !(lhs == rhs);
135 }
136
137 ARCANE_DEPRECATED_REASON("Y2022: This method returns a temporary. Use 'operator*' instead")
138 Item operator->() const { return _itemInternal(); }
139
140 protected:
141
142 ItemSharedInfo* m_shared_info;
143 const Int32* m_local_id_ptr;
144 Int32 m_local_id_offset = 0;
145
146 protected:
147
148 inline ItemInternal* _itemInternal() const
149 {
150 return m_shared_info->m_items_internal[m_local_id_offset + (*m_local_id_ptr)];
151 }
152};
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157template<typename ItemType>
160{
161 friend class ItemVectorViewT<ItemType>;
162 friend class ItemConnectedListViewT<ItemType>;
163
164 private:
165
166 ItemVectorViewConstIteratorT(ItemSharedInfo* shared_info,const Int32* ARCANE_RESTRICT local_id_ptr,
167 Int32 local_id_offset)
168 : ItemVectorViewConstIterator(shared_info,local_id_ptr,local_id_offset){}
169 ItemVectorViewConstIteratorT(ItemSharedInfo* shared_info,const Int32* ARCANE_RESTRICT local_id_ptr)
170 : ItemVectorViewConstIterator(shared_info,local_id_ptr){}
171
172 public:
173
174 // Temporaire (01/2023) pour conversion avec nouveau type ItemConnectedListView
177
178 public:
179
181 typedef ItemType value_type;
182
183 public:
184
185 //TODO A supprimer avec le C++20
186 typedef const Item* pointer;
187 //TODO A supprimer avec le C++20
188 typedef const Item& reference;
189
190 public:
191
192 ItemType operator*() const { return ItemType(m_local_id_offset + (*m_local_id_ptr), m_shared_info); }
193
194 ThatClass& operator++() { ++m_local_id_ptr; return (*this); }
195 ThatClass& operator--() { --m_local_id_ptr; return (*this); }
196 difference_type operator-(const ThatClass& b) const
197 {
198 return this->m_local_id_ptr - b.m_local_id_ptr;
199 }
200 friend ThatClass operator-(const ThatClass& a, difference_type v)
201 {
202 const Int32* ptr = a.m_local_id_ptr - v;
203 return ThatClass(a.m_shared_info, ptr, a.m_local_id_offset);
204 }
205 friend ThatClass operator+(const ThatClass& a, difference_type v)
206 {
207 const Int32* ptr = a.m_local_id_ptr + v;
208 return ThatClass(a.m_shared_info, ptr, a.m_local_id_offset);
209 }
210
211 public:
212
213 ARCANE_DEPRECATED_REASON("Y2022: This method returns a temporary. Use 'operator*' instead")
214 ItemType operator->() const { return this->_itemInternal(); }
215};
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219/*!
220 * \brief Vue sur un vecteur d'entités.
221 *
222 * \warning la vue n'est valide que tant que le tableau associé n'est
223 * pas modifié et que la famille d'entité associée à ce tableau n'est
224 * elle même pas modifiée.
225 */
226class ARCANE_CORE_EXPORT ItemVectorView
227{
228 // NOTE: Cette classe est mappée en C# et si on change sa structure il
229 // faut mettre à jour la version C# correspondante.
230
231 friend ItemVector;
232 friend ItemEnumeratorBase;
233 friend mesh::IndexedItemConnectivityAccessor;
234
235 public:
236
238 using difference_type = std::ptrdiff_t;
239 using value_type = Item;
240 using reference_type = Item&;
241 using const_reference_type = const Item&;
242 // TODO: Créér le type 'Sentinel' lorsqu'on sera en C++20
244
245 public:
246
247 ARCANE_DEPRECATED_REASON("Y2022: Use constructor with ItemInfoListView instead")
248 ItemVectorView(const ItemInternalArrayView& aitems, const Int32ConstArrayView& local_ids)
249 : m_index_view(local_ids)
250 {
251 _init(aitems);
252 }
253
254 ARCANE_DEPRECATED_REASON("Y2022: Use constructor with ItemInfoListView instead")
256 : m_index_view(indexes)
257 {
258 _init(aitems);
259 }
260
261 public:
262
263 ItemVectorView() = default;
264 // TODO Rendre obsolète (3.11+)
266 : m_index_view(view.localIds(),view.m_local_id_offset,0)
267 , m_shared_info(view.m_shared_info)
268 {}
269 // TODO A supprimer
270 ItemVectorView(ItemInfoListView item_info_list_view, ConstArrayView<Int32> local_ids)
271 : m_index_view(local_ids,0,0)
272 , m_shared_info(item_info_list_view.m_item_shared_info)
273 {}
274 ItemVectorView(ItemInfoListView item_info_list_view, ItemIndexArrayView indexes)
275 : m_index_view(indexes)
276 , m_shared_info(item_info_list_view.m_item_shared_info)
277 {}
281 : m_index_view(view.constLocalIds(),view.m_local_id_offset,0)
282 , m_shared_info(view.m_shared_info)
283 {}
284
285 // Temporaire (01/2023) pour conversion avec nouveau type ItemConnectedListView
287 : m_index_view(v.m_index_view)
288 , m_shared_info(v.m_shared_info)
289 {}
290
291 protected:
292
294 : m_index_view(local_ids)
295 , m_shared_info(shared_info)
296 {}
297
298 ItemVectorView(ItemSharedInfo* shared_info, ConstArrayView<Int32> local_ids, Int32 local_id_offset)
299 : m_index_view(local_ids,local_id_offset,0)
300 , m_shared_info(shared_info)
301 {}
302
303 // Temporaire pour éviter un avertissement de compilation lorsqu'on utilise le
304 // constructeur obsolète de ItemVectorViewT
305 ItemVectorView(const ItemInternalArrayView& aitems, const Int32ConstArrayView& local_ids, bool)
306 : m_index_view(local_ids)
307 {
308 _init(aitems);
309 }
310
311 // Temporaire pour éviter un avertissement de compilation lorsqu'on utilise le
312 // constructeur obsolète de ItemVectorViewT
314 : m_index_view(indexes)
315 {
316 _init(aitems);
317 }
318
319 public:
320
321 // TODO: a supprimer
322 operator ItemInternalVectorView() const
323 {
324 return ItemInternalVectorView(m_shared_info, m_index_view._localIds(), _localIdOffset());
325 }
326
327 //! Accède au \a i-ème élément du vecteur
328 Item operator[](Integer index) const { return Item(m_index_view[index], m_shared_info); }
329
330 //! Nombre d'éléments du vecteur
331 Int32 size() const { return m_index_view.size(); }
332
333 //! Tableau des entités
334 ARCANE_DEPRECATED_REASON("Y2022: Do not use this method")
335 ItemInternalArrayView items() const { return m_shared_info->m_items_internal; }
336
337 // TODO Rendre obsolète (3.11+)
338 /*!
339 * \brief Tableau des numéros locaux des entités.
340 *
341 * \deprecated Ne pas récupérer directement la liste des entités.
342 * Il est préférable de passer par des itérateurs ou par la méthode
343 * fillLocalIds() si on souhaite récupérer la liste des localId().
344 */
345 Int32ConstArrayView localIds() const { return m_index_view._localIds(); }
346
347 //! Ajoute à \a ids la liste des localIds() du vecteur.
348 void fillLocalIds(Array<Int32>& ids) const;
349
350 //! Sous-vue à partir de l'élément \a abegin et contenant \a asize éléments
351 ItemVectorView subView(Integer abegin, Integer asize) const
352 {
353 return ItemVectorView(m_shared_info, m_index_view.subView(abegin, asize)._localIds(), _localIdOffset());
354 }
355 const_iterator begin() const
356 {
357 return const_iterator(m_shared_info, m_index_view._data(), _localIdOffset());
358 }
359 SentinelType end() const
360 {
361 return endIterator();
362 }
363 const_iterator endIterator() const
364 {
365 return const_iterator(m_shared_info, (m_index_view._data() + this->size()), _localIdOffset());
366 }
367 //! Vue sur le tableau des indices
368 ItemIndexArrayView indexes() const { return m_index_view; }
369
370 public:
371
372 inline ItemEnumerator enumerator() const;
373
374 protected:
375
376 ItemIndexArrayView m_index_view;
377 ItemSharedInfo* m_shared_info = ItemSharedInfo::nullInstance();
378
379 protected:
380
381 const Int32* _localIdsData() const { return m_index_view._data(); }
382 Int32 _localIdOffset() const { return m_index_view._localIdOffset(); }
383
384 private:
385
386 void _init(ItemInternalArrayView items)
387 {
388 m_shared_info = (size() > 0 && !items.empty()) ? ItemInternalCompatibility::_getSharedInfo(items[0]) : ItemSharedInfo::nullInstance();
389 }
390 void _init2(IItemFamily* family);
391
392 public:
393
394 // Pour SWIG pour positionner les valeurs l'instance POD
395 void _internalSwigSet(ItemVectorViewPOD* vpod);
396};
397
398/*---------------------------------------------------------------------------*/
399/*---------------------------------------------------------------------------*/
400/*!
401 * \brief Vue sur un tableau typé d'entités.
402 */
403template<typename ItemType>
405: public ItemVectorView
406{
407 friend class ItemVectorT<ItemType>;
408 friend class ItemConnectedListViewT<ItemType>;
409
410 public:
411
412 using const_iterator = ItemVectorViewConstIteratorT<ItemType>;
413 using difference_type = std::ptrdiff_t;
414 using value_type = ItemType;
415 //TODO a supprimer avec le C++20
416 using reference_type = ItemType&;
417 //TODO a supprimer avec le C++20
418 using const_reference_type = const ItemType&;
419 // TODO: Créér le type 'Sentinel' lorsqu'on sera en C++20
420 using SentinelType = const_iterator;
421
422 public:
423
424 ARCANE_DEPRECATED_REASON("Y2022: Use constructor with ItemInfoListView instead")
425 ItemVectorViewT(const ItemInternalArrayView& aitems,const Int32ConstArrayView& local_ids)
426 : ItemVectorView(aitems,local_ids,true) {}
427
428 ARCANE_DEPRECATED_REASON("Y2022: Use constructor with ItemInfoListView instead")
430 : ItemVectorView(aitems,indexes,true) {}
431
432 public:
433
434 ItemVectorViewT() = default;
436 : ItemVectorView(rhs) {}
437 inline ItemVectorViewT(const ItemVectorT<ItemType>& rhs);
439 : ItemVectorView(rhs) {}
441 : ItemVectorView(rhs) {}
442 ItemVectorViewT(ItemInfoListView item_info_list_view,ConstArrayView<Int32> local_ids)
443 : ItemVectorView(item_info_list_view,local_ids) {}
445 : ItemVectorView(item_info_list_view,indexes) {}
447 : ItemVectorView(family,local_ids) {}
449 : ItemVectorView(family,indexes) {}
450
451 // Temporaire (01/2023) pour conversion avec nouveau type ItemConnectedListView
453 : ItemVectorView(v){}
454
455 protected:
456
457 ItemVectorViewT(ItemSharedInfo* shared_info,ConstArrayView<Int32> local_ids,Int32 local_id_offset)
458 : ItemVectorView(shared_info,local_ids,local_id_offset) { }
459
460 public:
461
462 ItemType operator[](Integer index) const
463 {
464 return ItemType(m_index_view[index],m_shared_info);
465 }
466
467 public:
468
469 inline ItemEnumeratorT<ItemType> enumerator() const
470 {
471 return ItemEnumeratorT<ItemType>(m_shared_info,m_index_view.m_view);
472 }
473 inline const_iterator begin() const
474 {
475 return const_iterator(m_shared_info, _localIdsData(), _localIdOffset());
476 }
477 inline SentinelType end() const
478 {
479 return const_iterator(m_shared_info, _localIdsData() + this->size(), _localIdOffset());
480 }
481 inline const_iterator endIterator() const
482 {
483 return const_iterator(m_shared_info, _localIdsData() + this->size(), _localIdOffset());
484 }
485};
486
487/*---------------------------------------------------------------------------*/
488/*---------------------------------------------------------------------------*/
489
490} // End namespace Arcane
491
492/*---------------------------------------------------------------------------*/
493/*---------------------------------------------------------------------------*/
494
495#endif
Interface d'une famille d'entités.
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é.
Enumérateur sur une liste typée d'entités de type ItemType.
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.
Vecteur typé d'entité.
Definition ItemVector.h:166
friend bool operator==(const ThatClass &lhs, const ThatClass &rhs)
Compare les indices d'itération de deux instances.
Integer size_type
Type indexant le tableau.
std::ptrdiff_t difference_type
Type d'une distance entre itérateur éléments du tableau.
Item value_type
Type indexant le tableau.
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
ItemVectorView subView(Integer abegin, Integer asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Int32 size() const
Nombre d'éléments du vecteur.
ItemIndexArrayView indexes() const
Vue sur le tableau des indices.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Item operator[](Integer index) const
Accède au i-ème élément du vecteur.
Vecteur d'entités.
Definition ItemVector.h:59
Classe de base d'un élément de maillage.
Definition Item.h:83
Classe de base des vecteurs 1D de données.
Vue constante d'un tableau de type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-