Arcane  v3.14.10.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 */
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
60 typedef std::random_access_iterator_tag iterator_category;
61 //! Type indexant le tableau
63 //! Type indexant le tableau
64 typedef Integer size_type;
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>
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
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>
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
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
242
243 public:
244
245 ItemConnectedListView() = default;
246
247 protected:
248
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
261 Item operator[](Integer index) const
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
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
277 {
278 return endIterator();
279 }
280
281 //! Itérateur sur après la dernière entité connectée
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>
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
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;
375 : BaseClass(rhs)
376 {}
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
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
Classe de base typeé des énumérateurs sur une liste d'entité connectées.
Classe de base des énumérateurs sur une liste d'entité connectées.
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
Classe de base des énumérateurs sur une liste d'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.
Int32 size() const
Nombre d'éléments du vecteur.
Vecteur typé d'entité.
Definition ItemVector.h:166
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
Vue constante d'un tableau de type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:640