Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemVector.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* ItemVector.h (C) 2000-2024 */
9/* */
10/* Vecteur d'entités de même genre. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_ITEMVECTOR_H
13#define ARCANE_CORE_ITEMVECTOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arcane/core/ItemVectorView.h"
19#include "arcane/core/IItemFamily.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \brief Vecteur d'entités.
31 *
32 * La classe ItemVector utilise une sémantique par référence.
33 *
34 * \note Cette classe n'est pas thread-safe et ne doit pas être utilisée par
35 * différents threads en même temps.
36 *
37 * \warning Un vecteur doit nécessairement être associée à une famille d'entité
38 * (ItemFamily*) avant d'être utilisé. Il est possible de le faire soit via
39 * l'appel à setFamily(), soit via un constructeur qui prend une famille
40 * en argument.
41 *
42 * \a ItemVector est la classe générique. Il est possible d'avoir une
43 * version spécialisée par genre d'entité via ItemVectorT.
44 *
45 * Le fonctionnement du vecteur d'entité est similaire à celui
46 * du groupe d'entité ItemGroup à la différence suivante:
47 * - le vecteur est local au sous-domaine
48 * - le vecteur est invalidé si la famille (IItemFamily) associée évolue
49 * (après appel à IItemFamily::endUpdate() si le compactage ou le tri est
50 * actif)
51 * - le vecteur peut contenir plusieurs fois la même entité.
52 *
53 * Un vecteur est intéressant pour construire une liste temporaire
54 * d'entités. Il reprend les fonctionnalités similaires à la classe
55 * Array et il est donc possible par exemple d'ajouter des éléments un par un,
56 * soit via un localId(), soit via une entité.
57 */
58class ARCANE_CORE_EXPORT ItemVector
59{
60 public:
61
62 using ItemType = Item;
63
64 public:
65
66 //! Créé un vecteur vide associé à la famille \a family.
67 explicit ItemVector(IItemFamily* afamily);
68
69 //! Créé un vecteur associé à la famille \a family et contenant les entités \a local_ids.
70 ItemVector(IItemFamily* afamily, Int32ConstArrayView local_ids);
71
72 //! Créé un vecteur pour \a size éléments associé à la famille \a family.
73 ItemVector(IItemFamily* afamily, Integer asize);
74
75 //! Créé un vecteur nul. Il faudra ensuite appeler setFamily() pour l'utiliser
76 ItemVector();
77
78 public:
79
80 //! Operateur de cast vers ItemVectorView
81 operator ItemVectorView() const { return view(); }
82
83 public:
84
85 /*!
86 * \brief Positionne la famille associée
87 *
88 * Le vecteur est vidé de ses éléments
89 */
90 void setFamily(IItemFamily* afamily);
91
92 //! Ajoute une entité de numéro local \a local_id à la fin du vecteur
93 void add(Int32 local_id) { m_local_ids.add(local_id); }
94
95 //! Ajoute une liste d'entité de numéros locaux \a local_ids à la fin du vecteur
96 void add(ConstArrayView<Int32> local_ids) { m_local_ids.addRange(local_ids); }
97
98 //! Ajoute une entité de numéro local \a local_id à la fin du vecteur
99 void addItem(ItemLocalId local_id) { m_local_ids.add(local_id); }
100
101 //! Ajoute une entité à la fin du vecteur
102 void addItem(Item item) { m_local_ids.add(item.localId()); }
103
104 //! Nombre d'éléments du vecteur
105 Int32 size() const { return m_local_ids.size(); }
106
107 //! Réserve la mémoire pour \a capacity entités
108 void reserve(Integer capacity) { m_local_ids.reserve(capacity); }
109
110 //! Supprime toutes les entités du vecteur.
111 void clear() { m_local_ids.clear(); }
112
113 //! Vue sur le vecteur
114 ItemVectorView view() const { return ItemVectorView(m_shared_info, m_local_ids, 0); }
115
116 //! Vue sur les numéros locaux
117 ArrayView<Int32> viewAsArray() { return m_local_ids.view(); }
118
119 //! Vue constante sur les numéros locaux
120 ConstArrayView<Int32> viewAsArray() const { return m_local_ids.constView(); }
121
122 //! Supprime l'entité à l'index \a index
123 void removeAt(Int32 index) { m_local_ids.remove(index); }
124
125 /*!
126 * \brief Positionne le nombre d'éléments du tableau.
127 *
128 * Si la nouvelle taille est supérieure à l'ancienne, les
129 * éléments ajoutés sont indéfinis.
130 */
131 void resize(Integer new_size) { m_local_ids.resize(new_size); }
132
133 //! Clone ce vecteur
134 ItemVector clone() { return ItemVector(m_family, m_local_ids.constView()); }
135
136 //! Entité à la position \a index du vecteur
137 Item operator[](Int32 index) const { return Item(m_local_ids[index], m_shared_info); }
138
139 //! Famille associée au vecteur
140 IItemFamily* family() const { return m_family; }
141
142 //! Enumérateur
143 ItemEnumerator enumerator() const { return ItemEnumerator(m_shared_info, m_local_ids); }
144
145 protected:
146
147 SharedArray<Int32> m_local_ids;
148 IItemFamily* m_family = nullptr;
149 ItemSharedInfo* m_shared_info = ItemSharedInfo::nullInstance();
150
151 private:
152
153 void _init();
154};
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158/*!
159 * \brief Vecteur typé d'entité.
160 *
161 * Pour plus d'infos, voir ItemVector.
162 */
163template <typename VectorItemType>
165: public ItemVector
166{
167 public:
168
169 using ItemType = VectorItemType;
170
171 public:
172
173 //! Constructeur vide
174 ItemVectorT() = default;
175
176 //! Constructeur vide avec famille
177 explicit ItemVectorT(IItemFamily* afamily)
178 : ItemVector(afamily)
179 {}
180
181 //! Créé un vecteur associé à la famille \a afamily et contenant les entités \a local_ids.
183 : ItemVector(afamily, local_ids)
184 {}
185
186 //! Constructeur par copie
188 : ItemVector(rhs)
189 {}
190
191 //! Constructeur pour \a asize élément pour la familly \a afamily
192 ItemVectorT(IItemFamily* afamily, Integer asize)
193 : ItemVector(afamily, asize)
194 {}
195
196 public:
197
198 //! Operateur de cast vers ItemVectorView
199 operator ItemVectorViewT<VectorItemType>() const { return view(); }
200
201 public:
202
203 //! Entité à la position \a index du vecteur
204 ItemType operator[](Int32 index) const
205 {
206 return ItemType(m_local_ids[index], m_shared_info);
207 }
208
209 //! Ajoute une entité à la fin du vecteur
210 void addItem(ItemType item) { m_local_ids.add(item.localId()); }
211
212 //! Ajoute une entité à la fin du vecteur
213 void addItem(ItemLocalIdT<ItemType> local_id) { m_local_ids.add(local_id); }
214
215 //! Vue sur le tableau entier
217 {
218 return ItemVectorViewT<ItemType>(m_shared_info, m_local_ids.constView(), 0);
219 }
220
221 //! Enumérateur
223 {
224 return ItemEnumeratorT<ItemType>(m_shared_info, m_local_ids);
225 }
226};
227
228/*---------------------------------------------------------------------------*/
229/*---------------------------------------------------------------------------*/
230
231template <typename ItemType> inline ItemVectorViewT<ItemType>::
232ItemVectorViewT(const ItemVectorT<ItemType>& rhs)
233: ItemVectorView(rhs.view())
234{
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
240} // namespace Arcane
241
242/*---------------------------------------------------------------------------*/
243/*---------------------------------------------------------------------------*/
244
245#endif
Types et macros pour itérer sur les entités du maillage.
Interface d'une famille d'entités.
Enumérateur sur une liste typée d'entités de type ItemType.
Enumérateur sur une liste d'entités.
Index d'une entité ItemType dans une variable.
Definition ItemLocalId.h:89
Index d'un Item dans une variable.
Definition ItemLocalId.h:40
Vecteur typé d'entité.
Definition ItemVector.h:166
ItemEnumeratorT< ItemType > enumerator() const
Enumérateur.
Definition ItemVector.h:222
void addItem(ItemType item)
Ajoute une entité à la fin du vecteur.
Definition ItemVector.h:210
ItemType operator[](Int32 index) const
Entité à la position index du vecteur.
Definition ItemVector.h:204
void addItem(ItemLocalIdT< ItemType > local_id)
Ajoute une entité à la fin du vecteur.
Definition ItemVector.h:213
ItemVectorT()=default
Constructeur vide.
ItemVectorT(IItemFamily *afamily, Integer asize)
Constructeur pour asize élément pour la familly afamily.
Definition ItemVector.h:192
ItemVectorT(IItemFamily *afamily, ConstArrayView< Int32 > local_ids)
Créé un vecteur associé à la famille afamily et contenant les entités local_ids.
Definition ItemVector.h:182
ItemVectorT(IItemFamily *afamily)
Constructeur vide avec famille.
Definition ItemVector.h:177
ItemVectorViewT< ItemType > view() const
Vue sur le tableau entier.
Definition ItemVector.h:216
ItemVectorT(const ItemVector &rhs)
Constructeur par copie.
Definition ItemVector.h:187
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
Vecteur d'entités.
Definition ItemVector.h:59
ConstArrayView< Int32 > viewAsArray() const
Vue constante sur les numéros locaux.
Definition ItemVector.h:120
void add(Int32 local_id)
Ajoute une entité de numéro local local_id à la fin du vecteur.
Definition ItemVector.h:93
void removeAt(Int32 index)
Supprime l'entité à l'index index.
Definition ItemVector.h:123
void clear()
Supprime toutes les entités du vecteur.
Definition ItemVector.h:111
ItemVector clone()
Clone ce vecteur.
Definition ItemVector.h:134
IItemFamily * family() const
Famille associée au vecteur.
Definition ItemVector.h:140
ItemVectorView view() const
Vue sur le vecteur.
Definition ItemVector.h:114
void addItem(Item item)
Ajoute une entité à la fin du vecteur.
Definition ItemVector.h:102
void resize(Integer new_size)
Positionne le nombre d'éléments du tableau.
Definition ItemVector.h:131
Int32 size() const
Nombre d'éléments du vecteur.
Definition ItemVector.h:105
ArrayView< Int32 > viewAsArray()
Vue sur les numéros locaux.
Definition ItemVector.h:117
void addItem(ItemLocalId local_id)
Ajoute une entité de numéro local local_id à la fin du vecteur.
Definition ItemVector.h:99
Item operator[](Int32 index) const
Entité à la position index du vecteur.
Definition ItemVector.h:137
ItemEnumerator enumerator() const
Enumérateur.
Definition ItemVector.h:143
void reserve(Integer capacity)
Réserve la mémoire pour capacity entités.
Definition ItemVector.h:108
void add(ConstArrayView< Int32 > local_ids)
Ajoute une liste d'entité de numéros locaux local_ids à la fin du vecteur.
Definition ItemVector.h:96
Classe de base d'un élément de maillage.
Definition Item.h:83
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
Vue modifiable d'un tableau d'un type T.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Vecteur 1D de données avec sémantique par référence.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-