Arcane  v4.1.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemData.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* ItemData.h (C) 2000-2025 */
9/* */
10/* Class gathering item data : ids and connectivities */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITEMDATA_H_
13#define ARCANE_ITEMDATA_H_
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include <stdexcept>
18#include <map>
19
21#include "arcane/mesh/MeshGlobal.h"
22#include "arcane/ArcaneTypes.h"
23#include "arcane/utils/Array.h"
24#include "arcane/utils/FatalErrorException.h"
25
26#include "arcane/IItemFamily.h"
27#include "arcane/IItemFamilyModifier.h"
28#include "arcane/ISerializer.h"
29#include "arcane/IMesh.h"
30#include "arcane/ISubDomain.h"
31#include "arcane/IParallelMng.h"
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36ARCANE_BEGIN_NAMESPACE
37ARCANE_MESH_BEGIN_NAMESPACE
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42class ARCANE_MESH_EXPORT ItemData
43{
44public:
45
62
64 ItemData() : m_nb_items(0), m_item_family(nullptr), m_item_family_modifier(nullptr), m_subdomain_id(-1){}
65
67 ItemData(const ItemData& rhs) = default;
68
73 ItemData(Integer nb_items, Integer info_size, Int32ArrayView item_lids, IItemFamily* item_family,
74 IItemFamilyModifier* item_family_modifier, Int32 subdomain_id)
75 : m_nb_items(nb_items)
76 , m_item_infos(info_size)
77 , m_item_lids(item_lids)
78 , m_item_family(item_family)
79 , m_item_family_modifier(item_family_modifier)
80 , m_subdomain_id(subdomain_id)
81 {
82 _ownerDefaultInit();
83 }
84
88 ItemData(Integer nb_items, Integer info_size, IItemFamily* item_family,
89 IItemFamilyModifier* item_family_modifier, Int32 subdomain_id)
90 : m_nb_items(nb_items)
91 , m_item_infos(info_size)
92 , _internal_item_lids(nb_items)
93 , m_item_lids(_internal_item_lids)
94 , m_item_family(item_family)
95 , m_item_family_modifier(item_family_modifier)
96 , m_subdomain_id(subdomain_id)
97 {
98 _ownerDefaultInit();
99 }
100
102 virtual ~ItemData() {}
103
104public:
105
106 Integer nbItems() const {return m_nb_items;}
107 Int64Array& itemInfos() {return m_item_infos;} // Need to return Array& since size is not always known at construction
108 Int64ConstArrayView itemInfos() const {return m_item_infos;}
109 Int32ArrayView itemLids() {return m_item_lids;}
110 Int32ArrayView itemOwners() { return m_item_owners;}
111 Int32ConstArrayView itemOwners() const { return m_item_owners;}
112 IItemFamily* itemFamily() {return m_item_family;}
113 IItemFamily const* itemFamily() const {return m_item_family;}
114 IItemFamilyModifier* itemFamilyModifier() {return m_item_family_modifier;}
115 Integer subDomainId() const {return m_subdomain_id;}
116
117 void serialize(ISerializer* buffer); // Fill the buffer from the data
118 void deserialize(ISerializer* buffer, IMesh* mesh); // Fill the buffer from the data : using an internal lids array
119 void deserialize(ISerializer* buffer, IMesh* mesh, Int32Array& item_lids); // Fill the data from the buffer using external lids array. item_lids must live as long as ItemData does...
120 void clear(); // Clear all internal data
121
122 private:
123
124 void _deserialize(ISerializer* buffer, IMesh* mesh);
125 void _ownerDefaultInit() { m_item_owners.resize(m_nb_items); m_item_owners.fill(m_subdomain_id);}
126
127 Integer m_nb_items;
128 // Todo optimization use std::reference_wrapper to avoid copy ids (int64 & int32)
129 // => in this case the second constructor won't be possible ?...(resize not possible with reference wrapper since not default constructible)
130 Int64SharedArray m_item_infos;
131 Int32UniqueArray _internal_item_lids; // m_item_lids points on it if the view is not given in the constructor
132 Int32ArrayView m_item_lids;
133 IItemFamily* m_item_family;
134 IItemFamilyModifier* m_item_family_modifier;
135 Integer m_subdomain_id;
136 Int32UniqueArray m_item_owners;
137
138};
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
143class ARCANE_MESH_EXPORT ItemDataList
144{
145public:
146
153
156
158 virtual ~ItemDataList() {}
159
160public:
161
162 ItemData& itemData(const Integer family_id)
163 {
164 auto inserter = m_item_infos_list.insert(std::make_pair(family_id,ItemData()));
165 ARCANE_ASSERT((inserter.second),(String::format("Cannot insert twice ItemData for family with id {0} in ItemInfosList",family_id).localstr()));
166 return inserter.first->second;
167 }
168
169 ItemData& itemData(const Integer family_id,
170 Integer nb_items,
171 Integer info_size,
172 Int32ArrayView item_lids,
173 IItemFamily* item_family,
174 IItemFamilyModifier* family_modifier,
175 const Integer& subdomain_id)
176 {
177 auto inserter = m_item_infos_list.insert(std::make_pair(family_id,ItemData(nb_items,info_size,item_lids,item_family,family_modifier,subdomain_id)));
178 ARCANE_ASSERT((inserter.second),(String::format("Cannot insert twice ItemData for family with id {0} in ItemInfosList",family_id).localstr()));
179 return inserter.first->second;
180 }
181
182 ItemData& operator[] (const Integer family_id){
183 return m_item_infos_list[family_id];
184 }
185
186 const ItemData& operator[] (const Integer family_id) const {
187 try {
188 return m_item_infos_list.at(family_id);
189 } catch (const std::out_of_range&) {
190 ARCANE_FATAL("Cannot return family with id {0}, not inserted in current ItemDataList",family_id);
191 }
192 }
193
194 Integer size() const { return arcaneCheckArraySize(m_item_infos_list.size()); }
195
196 bool contains(const Integer family_id) {
197 return m_item_infos_list.find(family_id) != m_item_infos_list.end();
198 }
199
200 void clear(const Integer family_id) {
201 m_item_infos_list.erase(family_id);
202 }
203
204private:
205 std::map<Integer, ItemData> m_item_infos_list;
206};
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
211ARCANE_MESH_END_NAMESPACE
212ARCANE_END_NAMESPACE
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
217#endif /* ITEMDATA_H_ */
Fichier de configuration d'Arcane.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Interface de modification d'une famille.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
ItemDataList()
Collection de structure de données nécessaire à l'ajout générique d'item (ItemData).
Definition ItemData.h:155
virtual ~ItemDataList()
Definition ItemData.h:158
ItemData(const ItemData &rhs)=default
Constructeur de recopie.
virtual ~ItemData()
Definition ItemData.h:102
ItemData(Integer nb_items, Integer info_size, Int32ArrayView item_lids, IItemFamily *item_family, IItemFamilyModifier *item_family_modifier, Int32 subdomain_id)
Definition ItemData.h:73
ItemData(Integer nb_items, Integer info_size, IItemFamily *item_family, IItemFamilyModifier *item_family_modifier, Int32 subdomain_id)
Definition ItemData.h:88
ItemData()
Structure de données nécessaire à l'ajout générique d'item.
Definition ItemData.h:64
SharedArray< Int64 > Int64SharedArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:408
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:511
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:509
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:370
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:482
std::int32_t Int32
Type entier signé sur 32 bits.