Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemConnectedListView.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* ItemConnectedListView.h (C) 2000-2023 */
9/* */
10/* Vue sur une liste d'entités connectés à une autre entité. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITEMCONNECTEDLISTVIEW_H
13#define ARCANE_ITEMCONNECTEDLISTVIEW_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/ItemInternalVectorView.h"
18#include "arcane/ItemIndexArrayView.h"
19#include "arcane/ItemInfoListView.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \internal
31 * \brief Itérateur pour la classe ItemConnectedListView.
32 *
33 * Cette classe est interne à Arcane. Elle s'utilise via le for-range:
34 *
35 * \code
36 * Node node;
37 * for( Item item : node.cells() )
38 * ;
39 * \endcode
40 */
41class ItemConnectedListViewConstIterator
42{
43 protected:
44
45 template <int Extent> friend class ItemConnectedListView;
46 friend class ItemVectorViewConstIterator;
47
48 protected:
49
50 ItemConnectedListViewConstIterator(ItemSharedInfo* shared_info, const Int32* local_id_ptr,
51 Int32 local_id_offset)
52 : m_shared_info(shared_info)
53 , m_local_id_ptr(local_id_ptr)
54 , m_local_id_offset(local_id_offset)
55 {}
56
57 public:
58
59 typedef ItemConnectedListViewConstIterator ThatClass;
60 typedef std::random_access_iterator_tag iterator_category;
61 //! Type indexant le tableau
63 //! Type indexant le tableau
65 //! Type d'une distance entre itérateur éléments du tableau
66 typedef std::ptrdiff_t difference_type;
67
68 public:
69
70 //TODO A supprimer avec le C++20
71 typedef const Item* pointer;
72 //TODO A supprimer avec le C++20
73 typedef const Item& reference;
74
75 public:
76
77 Item operator*() const
78 {
79 return Item(*m_local_id_ptr, m_shared_info);
80 }
81 ThatClass& operator++()
82 {
83 ++m_local_id_ptr;
84 return (*this);
85 }
86 ThatClass& operator--()
87 {
88 --m_local_id_ptr;
89 return (*this);
90 }
91 void operator+=(difference_type v)
92 {
93 m_local_id_ptr += v;
94 }
95 void operator-=(difference_type v)
96 {
97 m_local_id_ptr -= v;
98 }
99 difference_type operator-(const ThatClass& b) const
100 {
101 return this->m_local_id_ptr - b.m_local_id_ptr;
102 }
103 friend ThatClass operator-(const ThatClass& a, difference_type v)
104 {
105 const Int32* ptr = a.m_local_id_ptr - v;
106 return ThatClass(a.m_shared_info, ptr, a.m_local_id_offset);
107 }
108 friend ThatClass operator+(const ThatClass& a, difference_type v)
109 {
110 const Int32* ptr = a.m_local_id_ptr + v;
111 return ThatClass(a.m_shared_info, ptr, a.m_local_id_offset);
112 }
113 friend bool operator<(const ThatClass& lhs, const ThatClass& rhs)
114 {
115 return lhs.m_local_id_ptr <= rhs.m_local_id_ptr;
116 }
117 //! Compare les indices d'itération de deux instances
118 friend bool operator==(const ThatClass& lhs, const ThatClass& rhs)
119 {
120 return lhs.m_local_id_ptr == rhs.m_local_id_ptr;
121 }
122 friend bool operator!=(const ThatClass& lhs, const ThatClass& rhs)
123 {
124 return !(lhs == rhs);
125 }
126
127 ARCANE_DEPRECATED_REASON("Y2022: This method returns a temporary. Use 'operator*' instead")
128 Item operator->() const
129 {
130 return _itemInternal();
131 }
132
133 protected:
134
135 ItemSharedInfo* m_shared_info;
136 const Int32* m_local_id_ptr;
137 Int32 m_local_id_offset = 0;
138
139 protected:
140
141 inline ItemInternal* _itemInternal() const
142 {
143 return m_shared_info->m_items_internal[m_local_id_offset + (*m_local_id_ptr)];
144 }
145};
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
149
150template <typename ItemType>
151class ItemConnectedListViewConstIteratorT
152: public ItemConnectedListViewConstIterator
153{
154 friend class ItemConnectedListViewT<ItemType>;
155
156 private:
157
158 ItemConnectedListViewConstIteratorT(ItemSharedInfo* shared_info, const Int32* ARCANE_RESTRICT local_id_ptr,
159 Int32 local_id_offset)
160 : ItemConnectedListViewConstIterator(shared_info, local_id_ptr, local_id_offset)
161 {}
162
163 public:
164
165 typedef ItemConnectedListViewConstIteratorT<ItemType> ThatClass;
166 typedef ItemType value_type;
167
168 public:
169
170 //TODO A supprimer avec le C++20
171 typedef const Item* pointer;
172 //TODO A supprimer avec le C++20
173 typedef const Item& reference;
174
175 public:
176
177 ItemType operator*() const
178 {
179 return ItemType(*m_local_id_ptr, m_shared_info);
180 }
181 ThatClass& operator++()
182 {
183 ++m_local_id_ptr;
184 return (*this);
185 }
186 ThatClass& operator--()
187 {
188 --m_local_id_ptr;
189 return (*this);
190 }
191 difference_type operator-(const ThatClass& b) const
192 {
193 return this->m_local_id_ptr - b.m_local_id_ptr;
194 }
195 friend ThatClass operator-(const ThatClass& a, difference_type v)
196 {
197 const Int32* ptr = a.m_local_id_ptr - v;
198 return ThatClass(a.m_shared_info, 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);
204 }
205
206 public:
207
208 ARCANE_DEPRECATED_REASON("Y2022: This method returns a temporary. Use 'operator*' instead")
209 ItemType operator->() const
210 {
211 return this->_itemInternal();
212 }
213};
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217/*!
218 * \brief Vue sur une liste d'entités connectées à une autre entité.
219 *
220 * \warning la vue n'est valide que tant que le tableau associé n'est
221 * pas modifié et que la famille d'entité associée à ce tableau n'est
222 * elle même pas modifiée.
223 */
224template <int Extent>
225class ItemConnectedListView
226{
227 friend ItemVector;
228 friend class ItemEnumeratorBase;
229 friend class ItemVectorView;
230 friend class ItemConnectedEnumeratorBase;
231 template <typename ItemType> friend class ItemEnumeratorBaseT;
232
233 public:
234
235 using const_iterator = ItemConnectedListViewConstIterator;
236 using difference_type = std::ptrdiff_t;
237 using value_type = Item;
238 using reference_type = Item&;
239 using const_reference_type = const Item&;
240 // TODO: Créér le type 'Sentinel' lorsqu'on sera en C++20
241 using SentinelType = const_iterator;
242
243 public:
244
245 ItemConnectedListView() = default;
246
247 protected:
248
249 ItemConnectedListView(const impl::ItemIndexedListView<DynExtent>& view)
250 : m_index_view(view.m_local_ids,view.m_local_id_offset,0)
251 , m_shared_info(view.m_shared_info)
252 {}
253 ItemConnectedListView(ItemSharedInfo* shared_info, ConstArrayView<Int32> local_ids, Int32 local_id_offset)
254 : m_index_view(local_ids,local_id_offset,0)
255 , m_shared_info(shared_info)
256 {}
257
258 public:
259
260 //! \a index-ème entité connectée
262 {
263 return Item(m_index_view[index], m_shared_info);
264 }
265
266 //! Nombre d'éléments du vecteur
267 Int32 size() const { return m_index_view.size(); }
268
269 //! Itérateur sur la première entité connectée
270 const_iterator begin() const
271 {
272 return const_iterator(m_shared_info, m_index_view._data(), _localIdOffset());
273 }
274
275 //! Itérateur sur après la dernière entité connectée
276 SentinelType end() const
277 {
278 return endIterator();
279 }
280
281 //! Itérateur sur après la dernière entité connectée
282 const_iterator endIterator() const
283 {
284 return const_iterator(m_shared_info, (m_index_view._data() + this->size()), _localIdOffset());
285 }
286
287 friend std::ostream& operator<<(std::ostream& o, const ItemConnectedListView<Extent>& a)
288 {
289 o << a.m_index_view;
290 return o;
291 }
292
293 ARCANE_DEPRECATED_REASON("Y2023: Use iterator to get values or use operator[]")
294 Int32ConstArrayView localIds() const { return m_index_view._localIds(); }
295
296#ifdef ARCANE_HIDE_ITEM_CONNECTIVITY_STRUCTURE
297 private:
298
299#else
300 public:
301#endif
302
303 // Temporaire pour rendre les sources compatibles
304 operator ItemInternalVectorView() const
305 {
306 return ItemInternalVectorView(m_shared_info, m_index_view._localIds(), _localIdOffset());
307 }
308
309 // TODO: rendre obsolète
310 inline ItemEnumerator enumerator() const;
311
312 private:
313
314 //! Vue sur le tableau des indices
315 ItemIndexArrayView indexes() const
316 {
317 return m_index_view;
318 }
319
320 //! Vue sur le tableau des indices
321 Int32ConstArrayView _localIds() const
322 {
323 return m_index_view._localIds();
324 }
325
326 protected:
327
328 ItemIndexArrayView m_index_view;
329 ItemSharedInfo* m_shared_info = ItemSharedInfo::nullInstance();
330
331 protected:
332
333 const Int32* _localIdsData() const { return m_index_view._data(); }
334 Int32 _localIdOffset() const { return m_index_view._localIdOffset(); }
335};
336
337/*---------------------------------------------------------------------------*/
338/*---------------------------------------------------------------------------*/
339/*!
340 * \brief Vue sur une liste d'entités connectées à une autre.
341 */
342template <typename ItemType, int Extent>
343class ItemConnectedListViewT
344: public ItemConnectedListView<Extent>
345{
346 friend class ItemVectorT<ItemType>;
347 friend class ItemEnumeratorBaseT<ItemType>;
348 friend class ItemEnumerator;
349 friend class Item;
350 friend class ItemWithNodes;
351 friend class Node;
352 friend class Edge;
353 friend class Face;
354 friend class Cell;
355 friend class Particle;
356 friend class DoF;
357 template <typename T> friend class ItemConnectedEnumeratorBaseT;
358
359 using BaseClass = ItemConnectedListView<Extent>;
360 using BaseClass::m_index_view;
361 using BaseClass::m_shared_info;
362
363 public:
364
366 using difference_type = std::ptrdiff_t;
367 using value_type = ItemType;
368 // TODO: Créér le type 'Sentinel' lorsqu'on sera en C++20
369 using SentinelType = const_iterator;
370
371 private:
372
373 ItemConnectedListViewT() = default;
374 ItemConnectedListViewT(const ItemConnectedListView<Extent>& rhs)
375 : BaseClass(rhs)
376 {}
377 ItemConnectedListViewT(const impl::ItemIndexedListView<DynExtent>& rhs)
378 : BaseClass(rhs)
379 {}
380
381 protected:
382
383 ItemConnectedListViewT(ItemSharedInfo* shared_info, ConstArrayView<Int32> local_ids, Int32 local_id_offset)
384 : BaseClass(shared_info, local_ids, local_id_offset)
385 {}
386
387 public:
388
389 //! \a index-ème entité connectée
390 ItemType operator[](Integer index) const
391 {
392 return ItemType(m_index_view[index], m_shared_info);
393 }
394
395 public:
396
397 //! Itérateur sur la première entité connectée
398 inline const_iterator begin() const
399 {
400 return const_iterator(m_shared_info, this->_localIdsData(), this->_localIdOffset());
401 }
402 //! Itérateur sur après la dernière entité connectée
403 inline SentinelType end() const
404 {
405 return endIterator();
406 }
407 //! Itérateur sur après la dernière entité connectée
408 inline const_iterator endIterator() const
409 {
410 return const_iterator(m_shared_info, (this->_localIdsData() + this->size()), this->_localIdOffset());
411 }
412
413#ifdef ARCANE_HIDE_ITEM_CONNECTIVITY_STRUCTURE
414 private:
415
416#else
417 public:
418#endif
419
420 // TODO: rendre obsolète
421 inline ItemEnumeratorT<ItemType> enumerator() const
422 {
423 return ItemEnumeratorT<ItemType>(m_shared_info, m_index_view.m_view);
424 }
425};
426
427/*---------------------------------------------------------------------------*/
428/*---------------------------------------------------------------------------*/
429
430} // End namespace Arcane
431
432/*---------------------------------------------------------------------------*/
433/*---------------------------------------------------------------------------*/
434
435#endif
Vue constante d'un tableau de type T.
Integer size_type
Type indexant le tableau.
std::ptrdiff_t difference_type
Type d'une distance entre itérateur éléments du tableau.
friend bool operator==(const ThatClass &lhs, const ThatClass &rhs)
Compare les indices d'itération de deux instances.
Vue sur une liste d'entités connectées à une autre.
SentinelType end() const
Itérateur sur après la dernière entité connectée.
const_iterator endIterator() const
Itérateur sur après la dernière entité connectée.
ItemType operator[](Integer index) const
index-ème entité connectée
const_iterator begin() const
Itérateur sur la première entité connectée.
Vue sur une liste d'entités connectées à une autre entité.
SentinelType end() const
Itérateur sur après la dernière entité connectée.
const_iterator endIterator() const
Itérateur sur après la dernière entité connectée.
Int32 size() const
Nombre d'éléments du vecteur.
const_iterator begin() const
Itérateur sur la première entité connectée.
Item operator[](Integer index) const
index-ème entité connectée
Enumérateur sur une liste typée d'entités de type ItemType.
Vecteur typé d'entité.
Definition ItemVector.h:166
Classe de base d'un élément de maillage.
Definition Item.h:83
-*- 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::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.
std::int32_t Int32
Type entier signé sur 32 bits.