Arcane  v3.15.3.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.
68
69 //! Créé un vecteur associé à la famille \a family et contenant les entités \a local_ids.
71
72 //! Créé un vecteur pour \a size éléments associé à la famille \a family.
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
180
181 //! Créé un vecteur associé à la famille \a afamily et contenant les entités \a local_ids.
185
186 //! Constructeur par copie
188 : ItemVector(rhs)
189 {}
190
191 //! Constructeur pour \a asize élément pour la familly \a afamily
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 d'entités.
Index d'un Item dans une variable.
Definition ItemLocalId.h:41
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 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:219
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.
Référence à une instance.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-