Arcane  4.1.12.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{
30namespace mesh
31{
32 class IndexedItemConnectivityAccessor;
33}
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38/*!
39 * \brief Base class for iterators for ItemLocalIdViewT.
40 */
41class ItemLocalIdListViewConstIterator
42{
43 protected:
44
45 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewConstIterator(const Int32* local_id_ptr, Int32 local_id_offset)
46 : m_local_id_ptr(local_id_ptr)
47 , m_local_id_offset(local_id_offset)
48 {}
49
50 public:
51
52 typedef ItemLocalIdListViewConstIterator ThatClass;
53 typedef std::random_access_iterator_tag iterator_category;
54 //! Type indexing the array
56 //! Type of the size
58 //! Type of a difference between array iterator elements
59 typedef std::ptrdiff_t difference_type;
60
61 public:
62
63 constexpr ARCCORE_HOST_DEVICE Int32 operator*() const { return m_local_id_offset + (*m_local_id_ptr); }
64
65 constexpr ARCCORE_HOST_DEVICE ThatClass& operator++()
66 {
67 ++m_local_id_ptr;
68 return (*this);
69 }
70 constexpr ARCCORE_HOST_DEVICE ThatClass& operator--()
71 {
72 --m_local_id_ptr;
73 return (*this);
74 }
75 constexpr ARCCORE_HOST_DEVICE void operator+=(difference_type v) { m_local_id_ptr += v; }
76 constexpr ARCCORE_HOST_DEVICE void operator-=(difference_type v) { m_local_id_ptr -= v; }
77 constexpr ARCCORE_HOST_DEVICE difference_type operator-(const ThatClass& b) const
78 {
79 return this->m_local_id_ptr - b.m_local_id_ptr;
80 }
81 constexpr ARCCORE_HOST_DEVICE friend ThatClass operator-(const ThatClass& a, difference_type v)
82 {
83 const Int32* ptr = a.m_local_id_ptr - v;
84 return ThatClass(ptr, a.m_local_id_offset);
85 }
86 constexpr ARCCORE_HOST_DEVICE friend ThatClass operator+(const ThatClass& a, difference_type v)
87 {
88 const Int32* ptr = a.m_local_id_ptr + v;
89 return ThatClass(ptr, a.m_local_id_offset);
90 }
91 constexpr ARCCORE_HOST_DEVICE friend bool operator<(const ThatClass& lhs, const ThatClass& rhs)
92 {
93 return lhs.m_local_id_ptr <= rhs.m_local_id_ptr;
94 }
95 //! Compare the iteration indices of two instances
96 constexpr ARCCORE_HOST_DEVICE friend bool operator==(const ThatClass& lhs, const ThatClass& rhs)
97 {
98 return lhs.m_local_id_ptr == rhs.m_local_id_ptr;
99 }
100 constexpr ARCCORE_HOST_DEVICE friend bool operator!=(const ThatClass& lhs, const ThatClass& rhs)
101 {
102 return !(lhs == rhs);
103 }
104
105 protected:
106
107 const Int32* m_local_id_ptr;
108 Int32 m_local_id_offset = 0;
109};
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113
114/*!
115 * \brief Iterator for ItemLocalIdViewT.
116 */
117template <typename ItemType>
118class ItemLocalIdListViewConstIteratorT
119: public ItemLocalIdListViewConstIterator
120{
121 friend class ItemLocalIdListViewT<ItemType>;
122
123 private:
124
125 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewConstIteratorT(const Int32* local_id_ptr, Int32 local_id_offset)
126 : ItemLocalIdListViewConstIterator(local_id_ptr, local_id_offset)
127 {}
128
129 public:
130
131 using LocalIdType = typename ItemLocalIdTraitsT<ItemType>::LocalIdType;
132 using ThatClass = ItemLocalIdListViewConstIteratorT<ItemType>;
133 using value_type = LocalIdType;
134
135 public:
136
137 constexpr ARCCORE_HOST_DEVICE LocalIdType operator*() const
138 {
139 return LocalIdType(m_local_id_offset + (*m_local_id_ptr));
140 }
141
142 constexpr ARCCORE_HOST_DEVICE ThatClass& operator++()
143 {
144 ++m_local_id_ptr;
145 return (*this);
146 }
147 constexpr ARCCORE_HOST_DEVICE ThatClass& operator--()
148 {
149 --m_local_id_ptr;
150 return (*this);
151 }
152 constexpr ARCCORE_HOST_DEVICE difference_type operator-(const ThatClass& b) const
153 {
154 return this->m_local_id_ptr - b.m_local_id_ptr;
155 }
156 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator-(const ThatClass& a, difference_type v)
157 {
158 const Int32* ptr = a.m_local_id_ptr - v;
159 return ThatClass(ptr, a.m_local_id_offset);
160 }
161 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const ThatClass& a, difference_type v)
162 {
163 const Int32* ptr = a.m_local_id_ptr + v;
164 return ThatClass(ptr, a.m_local_id_offset);
165 }
166};
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
170
171/*!
172 * \brief View over a list of ItemLocalId.
173 */
174class ARCANE_CORE_EXPORT ItemLocalIdListView
176{
177 template <typename ItemType> friend class ItemLocalIdListViewT;
178 friend class ItemVectorView;
179 using impl::ItemLocalIdListContainerView::localId;
180 using impl::ItemLocalIdListContainerView::m_size;
181
182 public:
183
184 using ThatClass = ItemLocalIdListView;
185 using BaseClass = impl::ItemLocalIdListContainerView;
186
187 private:
188
189 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListView(const Int32* ids, Int32 s, Int32 local_id_offset)
190 : BaseClass(ids, s, local_id_offset)
191 {}
192 explicit constexpr ARCCORE_HOST_DEVICE ItemLocalIdListView(const BaseClass& view)
193 : BaseClass(view)
194 {}
195
196 public:
197
198 constexpr ARCCORE_HOST_DEVICE ItemLocalId operator[](Int32 index) const
199 {
200 return ItemLocalId(localId(index));
201 }
202 constexpr ARCCORE_HOST_DEVICE Int32 size() const { return m_size; }
203 impl::ItemLocalIdListContainerView containerView() const { return (*this); }
204
205 public:
206
207 friend ARCANE_CORE_EXPORT bool operator==(const ThatClass& lhs, const ThatClass& rhs);
208 friend inline bool operator!=(const ThatClass& lhs, const ThatClass& rhs)
209 {
210 return !operator==(lhs, rhs);
211 }
212 friend ARCANE_CORE_EXPORT std::ostream& operator<<(std::ostream& o, const ThatClass& lhs)
213 {
214 const BaseClass& v = lhs;
215 o << v;
216 return o;
217 }
218
219 private:
220
221 ConstArrayView<Int32> _idsWithoutOffset() const { return BaseClass::_idsWithoutOffset(); }
222};
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226
227/*!
228 * \brief Typed view over a list of connectivity entities.
229 */
230template <typename ItemType>
231class ItemLocalIdListViewT
232: public ItemLocalIdListView
233{
234 friend class ItemConnectivityContainerView;
235 friend mesh::IndexedItemConnectivityAccessor;
236 friend ArcaneTest::MeshUnitTest;
237 friend class Item;
238 friend class ItemInternalConnectivityList;
239
240 public:
241
242 using LocalIdType = typename ItemLocalIdTraitsT<ItemType>::LocalIdType;
243 using const_iterator = ItemLocalIdListViewConstIteratorT<ItemType>;
244 // TODO: Create the 'Sentinel' type when we are in C++20
245 using SentinelType = const_iterator;
246
247 public:
248
249 ItemLocalIdListViewT() = default;
250
251 private:
252
253 constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewT(const Int32* ids, Int32 s, Int32 local_id_offset)
254 : ItemLocalIdListView(ids, s, local_id_offset)
255 {}
256 explicit constexpr ARCCORE_HOST_DEVICE ItemLocalIdListViewT(const impl::ItemLocalIdListContainerView& view)
257 : ItemLocalIdListView(view)
258 {}
259
260 public:
261
262 constexpr ARCCORE_HOST_DEVICE LocalIdType operator[](Int32 i) const { return LocalIdType(localId(i)); }
263
264 constexpr ARCCORE_HOST_DEVICE const_iterator begin() const
265 {
266 return const_iterator(m_local_ids, m_local_id_offset);
267 }
268 constexpr ARCCORE_HOST_DEVICE SentinelType end() const
269 {
270 return endIterator();
271 }
272 constexpr ARCCORE_HOST_DEVICE const_iterator endIterator() const
273 {
274 return const_iterator(m_local_ids + m_size, m_local_id_offset);
275 }
276};
277
278/*---------------------------------------------------------------------------*/
279/*---------------------------------------------------------------------------*/
280
281} // namespace Arcane
282
283/*---------------------------------------------------------------------------*/
284/*---------------------------------------------------------------------------*/
285
286#endif
Constant view of an array of type T.
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.
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.