Arcane  4.2.3.0
User documentation
Loading...
Searching...
No Matches
ItemLocalIdListView.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* ItemLocalIdListView.h (C) 2000-2023 */
9/* */
10/* View over a list of ItemLocalId. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_ITEMLOCALIDLISTVIEW_H
13#define ARCANE_CORE_ITEMLOCALIDLISTVIEW_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/ItemLocalId.h"
18#include "arcane/core/ItemLocalIdListContainerView.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace ArcaneTest
24{
25class MeshUnitTest;
26}
27
28namespace Arcane
29{
31namespace mesh
32{
33 class IndexedItemConnectivityAccessor;
34}
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38/*!
39 * \brief Sentinel for method ItemLocalIdListView::end().
40 */
41class ItemLocalIdListViewIteratorSentinel
42{
43 friend ItemLocalIdListViewConstIterator;
44 template <typename ItemType> friend class ItemLocalIdListViewT;
45
46 public:
47
48 ItemLocalIdListViewIteratorSentinel() = default;
49
50 protected:
51
52 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewIteratorSentinel(const Int32* local_id_ptr)
53 : m_local_id_ptr(local_id_ptr)
54 {}
55
56 private:
57
58 const Int32* m_local_id_ptr = nullptr;
59};
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63/*!
64 * \brief Base class for iterators for ItemLocalIdViewT.
65 */
66class ItemLocalIdListViewConstIterator
67{
68 protected:
69
70 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewConstIterator(const Int32* local_id_ptr, Int32 local_id_offset)
71 : m_local_id_ptr(local_id_ptr)
72 , m_local_id_offset(local_id_offset)
73 {}
74
75 public:
76
77 typedef ItemLocalIdListViewConstIterator ThatClass;
78 typedef std::random_access_iterator_tag iterator_category;
79 //! Type indexing the array
81 //! Type of the size
83 //! Type of a difference between array iterator elements
84 typedef std::ptrdiff_t difference_type;
85
86 public:
87
88 constexpr ARCCORE_HOST_DEVICE Int32 operator*() const { return m_local_id_offset + (*m_local_id_ptr); }
89
90 constexpr ARCCORE_HOST_DEVICE ThatClass& operator++()
91 {
92 ++m_local_id_ptr;
93 return (*this);
94 }
95 constexpr ARCCORE_HOST_DEVICE ThatClass& operator--()
96 {
97 --m_local_id_ptr;
98 return (*this);
99 }
100 constexpr ARCCORE_HOST_DEVICE void operator+=(difference_type v) { m_local_id_ptr += v; }
101 constexpr ARCCORE_HOST_DEVICE void operator-=(difference_type v) { m_local_id_ptr -= v; }
102 constexpr ARCCORE_HOST_DEVICE difference_type operator-(const ThatClass& b) const
103 {
104 return this->m_local_id_ptr - b.m_local_id_ptr;
105 }
106 constexpr ARCCORE_HOST_DEVICE friend ThatClass operator-(const ThatClass& a, difference_type v)
107 {
108 const Int32* ptr = a.m_local_id_ptr - v;
109 return ThatClass(ptr, a.m_local_id_offset);
110 }
111 constexpr ARCCORE_HOST_DEVICE friend ThatClass operator+(const ThatClass& a, difference_type v)
112 {
113 const Int32* ptr = a.m_local_id_ptr + v;
114 return ThatClass(ptr, a.m_local_id_offset);
115 }
116 constexpr ARCCORE_HOST_DEVICE friend bool operator<(const ThatClass& lhs, const ThatClass& rhs)
117 {
118 return lhs.m_local_id_ptr <= rhs.m_local_id_ptr;
119 }
120 //! Compare the iteration indices of two instances
121 constexpr ARCCORE_HOST_DEVICE friend bool operator==(const ThatClass& lhs, const ThatClass& rhs)
122 {
123 return lhs.m_local_id_ptr == rhs.m_local_id_ptr;
124 }
125 constexpr ARCCORE_HOST_DEVICE friend bool operator!=(const ThatClass& lhs, const ThatClass& rhs)
126 {
127 return !(lhs == rhs);
128 }
129 constexpr ARCCORE_HOST_DEVICE static bool
130 isEnd(const ThatClass& lhs, const ItemLocalIdListViewIteratorSentinel& rhs)
131 {
132 return lhs.m_local_id_ptr == rhs.m_local_id_ptr;
133 }
134 constexpr ARCCORE_HOST_DEVICE friend bool
135 operator==(const ThatClass& lhs, const ItemLocalIdListViewIteratorSentinel& rhs)
136 {
137 return isEnd(lhs, rhs);
138 }
139 constexpr ARCCORE_HOST_DEVICE friend bool
140 operator!=(const ThatClass& lhs, const ItemLocalIdListViewIteratorSentinel& rhs)
141 {
142 return !isEnd(lhs, rhs);
143 }
144
145 protected:
146
147 const Int32* m_local_id_ptr;
148 Int32 m_local_id_offset = 0;
149};
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
153
154/*!
155 * \brief Iterator for ItemLocalIdViewT.
156 */
157template <typename ItemType>
158class ItemLocalIdListViewConstIteratorT
159: public ItemLocalIdListViewConstIterator
160{
161 friend class ItemLocalIdListViewT<ItemType>;
162
163 private:
164
165 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewConstIteratorT(const Int32* local_id_ptr, Int32 local_id_offset)
166 : ItemLocalIdListViewConstIterator(local_id_ptr, local_id_offset)
167 {}
168
169 public:
170
171 using LocalIdType = typename ItemLocalIdTraitsT<ItemType>::LocalIdType;
172 using ThatClass = ItemLocalIdListViewConstIteratorT<ItemType>;
173 using value_type = LocalIdType;
174
175 public:
176
177 constexpr ARCCORE_HOST_DEVICE LocalIdType operator*() const
178 {
179 return LocalIdType(m_local_id_offset + (*m_local_id_ptr));
180 }
181
182 constexpr ARCCORE_HOST_DEVICE ThatClass& operator++()
183 {
184 ++m_local_id_ptr;
185 return (*this);
186 }
187 constexpr ARCCORE_HOST_DEVICE ThatClass& operator--()
188 {
189 --m_local_id_ptr;
190 return (*this);
191 }
192 constexpr ARCCORE_HOST_DEVICE difference_type operator-(const ThatClass& b) const
193 {
194 return this->m_local_id_ptr - b.m_local_id_ptr;
195 }
196 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator-(const ThatClass& a, difference_type v)
197 {
198 const Int32* ptr = a.m_local_id_ptr - v;
199 return ThatClass(ptr, a.m_local_id_offset);
200 }
201 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const ThatClass& a, difference_type v)
202 {
203 const Int32* ptr = a.m_local_id_ptr + v;
204 return ThatClass(ptr, a.m_local_id_offset);
205 }
206};
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
211/*!
212 * \brief View over a list of ItemLocalId.
213 */
214class ARCANE_CORE_EXPORT ItemLocalIdListView
216{
217 template <typename ItemType> friend class ItemLocalIdListViewT;
218 friend class ItemVectorView;
219 using impl::ItemLocalIdListContainerView::localId;
220 using impl::ItemLocalIdListContainerView::m_size;
221
222 public:
223
224 using ThatClass = ItemLocalIdListView;
225 using BaseClass = impl::ItemLocalIdListContainerView;
226 using SentinelType = ItemLocalIdListViewIteratorSentinel;
227
228 private:
229
230 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListView(const Int32* ids, Int32 s, Int32 local_id_offset)
231 : BaseClass(ids, s, local_id_offset)
232 {}
233 explicit constexpr ARCCORE_HOST_DEVICE ItemLocalIdListView(const BaseClass& view)
234 : BaseClass(view)
235 {}
236
237 public:
238
239 constexpr ARCCORE_HOST_DEVICE ItemLocalId operator[](Int32 index) const
240 {
241 return ItemLocalId(localId(index));
242 }
243 constexpr ARCCORE_HOST_DEVICE Int32 size() const { return m_size; }
244 impl::ItemLocalIdListContainerView containerView() const { return (*this); }
245
246 public:
247
248 friend ARCANE_CORE_EXPORT bool operator==(const ThatClass& lhs, const ThatClass& rhs);
249 friend inline bool operator!=(const ThatClass& lhs, const ThatClass& rhs)
250 {
251 return !operator==(lhs, rhs);
252 }
253 friend ARCANE_CORE_EXPORT std::ostream& operator<<(std::ostream& o, const ThatClass& lhs)
254 {
255 const BaseClass& v = lhs;
256 o << v;
257 return o;
258 }
259
260 private:
261
262 ConstArrayView<Int32> _idsWithoutOffset() const { return BaseClass::_idsWithoutOffset(); }
263};
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267/*!
268 * \brief Typed view over a list of connectivity entities.
269 */
270template <typename ItemType>
271class ItemLocalIdListViewT
272: public ItemLocalIdListView
273{
274 friend class ItemConnectivityContainerView;
275 friend mesh::IndexedItemConnectivityAccessor;
276 friend ArcaneTest::MeshUnitTest;
277 friend class Item;
278 friend class ItemInternalConnectivityList;
279
280 public:
281
282 using LocalIdType = typename ItemLocalIdTraitsT<ItemType>::LocalIdType;
283 using const_iterator = ItemLocalIdListViewConstIteratorT<ItemType>;
284 using SentinelType = ItemLocalIdListViewIteratorSentinel;
285
286 public:
287
288 ItemLocalIdListViewT() = default;
289
290 private:
291
292 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewT(const Int32* ids, Int32 s, Int32 local_id_offset)
293 : ItemLocalIdListView(ids, s, local_id_offset)
294 {}
295 explicit constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewT(const impl::ItemLocalIdListContainerView& view)
296 : ItemLocalIdListView(view)
297 {}
298
299 public:
300
301 constexpr ARCCORE_HOST_DEVICE LocalIdType operator[](Int32 i) const { return LocalIdType(localId(i)); }
302
303 constexpr ARCCORE_HOST_DEVICE const_iterator begin() const
304 {
305 return const_iterator(m_local_ids, m_local_id_offset);
306 }
307 constexpr ARCCORE_HOST_DEVICE SentinelType end() const
308 {
309 return SentinelType(m_local_ids + m_size);
310 }
311 constexpr ARCCORE_HOST_DEVICE const_iterator endIterator() const
312 {
313 return const_iterator(m_local_ids + m_size, m_local_id_offset);
314 }
315};
316
317/*---------------------------------------------------------------------------*/
318/*---------------------------------------------------------------------------*/
319
320} // namespace Arcane
321
322/*---------------------------------------------------------------------------*/
323/*---------------------------------------------------------------------------*/
324
325#endif
Constant view of an array of type T.
Base class for iterators for ItemLocalIdViewT.
Int32 value_type
Type indexing the array.
std::ptrdiff_t difference_type
Type of a difference between array iterator elements.
constexpr __host__ __device__ friend bool operator==(const ThatClass &lhs, const ThatClass &rhs)
Compare the iteration indices of two instances.
Sentinel for method ItemLocalIdListView::end().
Typed view over a list of connectivity entities.
typename ItemTraitsT< ItemType >::LocalIdType LocalIdType
Type of the localId().
Definition ItemTypes.h:825
Index of an Item in a variable.
Definition ItemLocalId.h:42
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 LocalIdType
Type of integers used to store local identifiers of entities.
std::int32_t Int32
Signed integer type of 32 bits.