Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ItemData.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/* ItemData.h (C) 2000-2025 */
9/* */
10/* Class gathering item data : ids and connectivities */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MESH_ITEMDATA_H
13#define ARCANE_MESH_ITEMDATA_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include <stdexcept>
18#include <map>
19
21#include "arcane/mesh/MeshGlobal.h"
23#include "arcane/utils/Array.h"
24#include "arcane/utils/FatalErrorException.h"
25
26#include "arcane/core/IItemFamily.h"
27#include "arcane/core/IItemFamilyModifier.h"
28#include "arcane/core/ISerializer.h"
29#include "arcane/core/IMesh.h"
30#include "arcane/core/ISubDomain.h"
31#include "arcane/core/IParallelMng.h"
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane::mesh
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42class ARCANE_MESH_EXPORT ItemData
43{
44 public:
45
62
65 : m_nb_items(0)
66 , m_item_family(nullptr)
67 , m_item_family_modifier(nullptr)
68 , m_subdomain_id(-1)
69 {}
70
72 ItemData(const ItemData& rhs) = default;
73
78 ItemData(Integer nb_items, Integer info_size, Int32ArrayView item_lids, IItemFamily* item_family,
79 IItemFamilyModifier* item_family_modifier, Int32 subdomain_id)
80 : m_nb_items(nb_items)
81 , m_item_infos(info_size)
82 , m_item_lids(item_lids)
83 , m_item_family(item_family)
84 , m_item_family_modifier(item_family_modifier)
85 , m_subdomain_id(subdomain_id)
86 {
87 _ownerDefaultInit();
88 }
89
93 ItemData(Integer nb_items, Integer info_size, IItemFamily* item_family,
94 IItemFamilyModifier* item_family_modifier, Int32 subdomain_id)
95 : m_nb_items(nb_items)
96 , m_item_infos(info_size)
97 , _internal_item_lids(nb_items)
98 , m_item_lids(_internal_item_lids)
99 , m_item_family(item_family)
100 , m_item_family_modifier(item_family_modifier)
101 , m_subdomain_id(subdomain_id)
102 {
103 _ownerDefaultInit();
104 }
105
107 virtual ~ItemData() {}
108
109 public:
110
111 Integer nbItems() const { return m_nb_items; }
112 Int64Array& itemInfos() { return m_item_infos; } // Need to return Array& since size is not always known at construction
113 Int64ConstArrayView itemInfos() const { return m_item_infos; }
114 Int32ArrayView itemLids() { return m_item_lids; }
115 Int32ArrayView itemOwners() { return m_item_owners; }
116 Int32ConstArrayView itemOwners() const { return m_item_owners; }
117 IItemFamily* itemFamily() { return m_item_family; }
118 IItemFamily const* itemFamily() const { return m_item_family; }
119 IItemFamilyModifier* itemFamilyModifier() { return m_item_family_modifier; }
120 Integer subDomainId() const { return m_subdomain_id; }
121
122 void serialize(ISerializer* buffer); // Fill the buffer from the data
123 void deserialize(ISerializer* buffer, IMesh* mesh); // Fill the buffer from the data : using an internal lids array
124 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...
125 void clear(); // Clear all internal data
126
127 private:
128
129 void _deserialize(ISerializer* buffer, IMesh* mesh);
130 void _ownerDefaultInit()
131 {
132 m_item_owners.resize(m_nb_items);
133 m_item_owners.fill(m_subdomain_id);
134 }
135
136 Integer m_nb_items;
137 // Todo optimization use std::reference_wrapper to avoid copy ids (int64 & int32)
138 // => in this case the second constructor won't be possible ?...(resize not possible with reference wrapper since not default constructible)
139 Int64SharedArray m_item_infos;
140 Int32UniqueArray _internal_item_lids; // m_item_lids points on it if the view is not given in the constructor
141 Int32ArrayView m_item_lids;
142 IItemFamily* m_item_family;
143 IItemFamilyModifier* m_item_family_modifier;
144 Integer m_subdomain_id;
145 Int32UniqueArray m_item_owners;
146};
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151class ARCANE_MESH_EXPORT ItemDataList
152{
153 public:
154
161
164
166 virtual ~ItemDataList() {}
167
168 public:
169
170 ItemData& itemData(const Integer family_id)
171 {
172 auto inserter = m_item_infos_list.insert(std::make_pair(family_id, ItemData()));
173 ARCANE_ASSERT((inserter.second), (String::format("Cannot insert twice ItemData for family with id {0} in ItemInfosList", family_id).localstr()));
174 return inserter.first->second;
175 }
176
177 ItemData& itemData(const Integer family_id,
178 Integer nb_items,
179 Integer info_size,
180 Int32ArrayView item_lids,
181 IItemFamily* item_family,
182 IItemFamilyModifier* family_modifier,
183 const Integer& subdomain_id)
184 {
185 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)));
186 ARCANE_ASSERT((inserter.second), (String::format("Cannot insert twice ItemData for family with id {0} in ItemInfosList", family_id).localstr()));
187 return inserter.first->second;
188 }
189
190 ItemData& operator[](const Integer family_id)
191 {
192 return m_item_infos_list[family_id];
193 }
194
195 const ItemData& operator[](const Integer family_id) const
196 {
197 try {
198 return m_item_infos_list.at(family_id);
199 }
200 catch (const std::out_of_range&) {
201 ARCANE_FATAL("Cannot return family with id {0}, not inserted in current ItemDataList", family_id);
202 }
203 }
204
205 Integer size() const { return arcaneCheckArraySize(m_item_infos_list.size()); }
206
207 bool contains(const Integer family_id)
208 {
209 return m_item_infos_list.find(family_id) != m_item_infos_list.end();
210 }
211
212 void clear(const Integer family_id)
213 {
214 m_item_infos_list.erase(family_id);
215 }
216
217 private:
218
219 std::map<Integer, ItemData> m_item_infos_list;
220};
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224
225} // namespace Arcane::mesh
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
230#endif
Arcane configuration file.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Declarations of Arcane's general types.
Interface for modifying a family.
Interface of an entity family.
Definition IItemFamily.h:83
ItemDataList()
Collection of data structures necessary for generic item addition (ItemData).
Definition ItemData.h:163
ItemData(Integer nb_items, Integer info_size, Int32ArrayView item_lids, IItemFamily *item_family, IItemFamilyModifier *item_family_modifier, Int32 subdomain_id)
Definition ItemData.h:78
ItemData(const ItemData &rhs)=default
Copy constructor.
ItemData(Integer nb_items, Integer info_size, IItemFamily *item_family, IItemFamilyModifier *item_family_modifier, Int32 subdomain_id)
Definition ItemData.h:93
ItemData()
Data structure necessary for generic item addition.
Definition ItemData.h:64
SharedArray< Int64 > Int64SharedArray
Dynamic 1D array of 64-bit integers.
Definition UtilsTypes.h:379
Array< Int64 > Int64Array
Dynamic one-dimensional array of 64-bit integers.
Definition UtilsTypes.h:125
Integer arcaneCheckArraySize(unsigned long long size)
Checks that size can be converted into an 'Integer' to serve as the size of an array....
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:482
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
Definition UtilsTypes.h:341
ArrayView< Int32 > Int32ArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:453
std::int32_t Int32
Signed integer type of 32 bits.