Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
SmallArray.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/* SmallArray.h (C) 2000-2025 */
9/* */
10/* Tableau 1D de données avec buffer pré-alloué. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_STACKARRAY_H
13#define ARCANE_UTILS_STACKARRAY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18#include "arcane/utils/MemoryAllocator.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane::impl
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28/*!
29 * \internal
30 * \brief Allocateur avec buffer pré-alloué.
31 *
32 * Le buffer pré-alloué \a m_preallocated_buffer est utilisé lorsque la
33 * taille demandée pour l'allocation est inférieure ou égale à
34 * \a m_preallocated_size.
35 *
36 * Le buffer utilisé doit rester valide durant toute la durée de vie de l'allocateur.
37 */
38class ARCANE_UTILS_EXPORT StackMemoryAllocator final
39: public IMemoryAllocator3
40{
41 public:
42
43 StackMemoryAllocator(void* buf, size_t size)
44 : m_preallocated_buffer(buf)
45 , m_preallocated_size(size)
46 {}
47
48 public:
49
50 bool hasRealloc(MemoryAllocationArgs) const final { return true; }
51 AllocatedMemoryInfo allocate(MemoryAllocationArgs args, Int64 new_size) final;
52 AllocatedMemoryInfo reallocate(MemoryAllocationArgs args, AllocatedMemoryInfo current_ptr, Int64 new_size) final;
53 void deallocate(MemoryAllocationArgs args, AllocatedMemoryInfo ptr) final;
54 Int64 adjustedCapacity(MemoryAllocationArgs, Int64 wanted_capacity, Int64) const final { return wanted_capacity; }
55 size_t guarantedAlignment(MemoryAllocationArgs) const final { return 0; }
56
57 private:
58
59 void* m_preallocated_buffer = nullptr;
60 Int64 m_preallocated_size = 0;
61};
62
63} // namespace Arcane::impl
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68namespace Arcane
69{
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73/*!
74 * \ingroup Collection
75 *
76 * \brief Tableau 1D de données avec buffer pré-alloué sur la pile.
77 *
78 * Cette classe s'utilise comme UniqueArray mais contient un buffer de taille
79 * fixe pour conserver \a NbElement éléments qui est utilisé si le tableau contient
80 * au plus \a NbElement éléments. Cela permet d'éviter des allocations dynamiques
81 * lorsque le nombre d'éléments est faible.
82 *
83 * Si le tableau doit contenir plus de \a NbElement éléments, alors on utilise
84 * une allocation dynamique standard.
85 */
86template <typename T, Int32 NbElement = 32>
87class SmallArray final
88: public Array<T>
89{
90 using BaseClassType = AbstractArray<T>;
91 static constexpr Int32 SizeOfType = static_cast<Int32>(sizeof(T));
92 static constexpr Int32 nb_element_in_buf = NbElement;
93
94 public:
95
96 using typename BaseClassType::ConstReferenceType;
97 static constexpr Int32 MemorySize = NbElement * SizeOfType;
98
99 public:
100
101 //! Créé un tableau vide
102 SmallArray()
103 : m_stack_allocator(m_stack_buffer, MemorySize)
104 {
105 this->_initFromAllocator(&m_stack_allocator, nb_element_in_buf);
106 }
107
108 //! Créé un tableau de \a size éléments contenant la valeur \a value.
109 SmallArray(Int64 req_size, ConstReferenceType value)
110 : SmallArray()
111 {
112 this->_resize(req_size, value);
113 }
114
115 //! Créé un tableau de \a asize éléments contenant la valeur par défaut du type T()
116 explicit SmallArray(Int64 asize)
117 : SmallArray()
118 {
119 this->_resize(asize);
120 }
121
122 //! Créé un tableau de \a asize éléments contenant la valeur par défaut du type T()
123 explicit SmallArray(Int32 asize)
124 : SmallArray((Int64)asize)
125 {
126 }
127
128 //! Créé un tableau de \a asize éléments contenant la valeur par défaut du type T()
129 explicit SmallArray(size_t asize)
130 : SmallArray((Int64)asize)
131 {
132 }
133
134 //! Créé un tableau en recopiant les valeurs de la value \a aview.
135 SmallArray(const ConstArrayView<T>& aview)
136 : SmallArray(Span<const T>(aview))
137 {
138 }
139
140 //! Créé un tableau en recopiant les valeurs de la value \a aview.
141 SmallArray(const Span<const T>& aview)
142 : SmallArray()
143 {
144 this->_initFromSpan(aview);
145 }
146
147 //! Créé un tableau en recopiant les valeurs de la value \a aview.
148 SmallArray(const ArrayView<T>& aview)
149 : SmallArray(Span<const T>(aview))
150 {
151 }
152
153 //! Créé un tableau en recopiant les valeurs de la value \a aview.
154 SmallArray(const Span<T>& aview)
155 : SmallArray(Span<const T>(aview))
156 {
157 }
158
159 SmallArray(std::initializer_list<T> alist)
160 : SmallArray()
161 {
162 this->_initFromInitializerList(alist);
163 }
164
165 //! Créé un tableau en recopiant les valeurs \a rhs.
166 SmallArray(const Array<T>& rhs)
167 : SmallArray(rhs.constSpan())
168 {
169 }
170
171 //! Copie les valeurs de \a rhs dans cette instance.
172 void operator=(const Array<T>& rhs)
173 {
174 this->copy(rhs.constSpan());
175 }
176
177 //! Copie les valeurs de la vue \a rhs dans cette instance.
178 void operator=(const ArrayView<T>& rhs)
179 {
180 this->copy(rhs);
181 }
182
183 //! Copie les valeurs de la vue \a rhs dans cette instance.
184 void operator=(const Span<T>& rhs)
185 {
186 this->copy(rhs);
187 }
188
189 //! Copie les valeurs de la vue \a rhs dans cette instance.
190 void operator=(const ConstArrayView<T>& rhs)
191 {
192 this->copy(rhs);
193 }
194
195 //! Copie les valeurs de la vue \a rhs dans cette instance.
196 void operator=(const Span<const T>& rhs)
197 {
198 this->copy(rhs);
199 }
200
201 //! Détruit l'instance.
202 ~SmallArray() override
203 {
204 // Il faut détruire explicitement car notre allocateur
205 // sera détruit avant la classe de base et ne sera plus valide
206 // lors de la désallocation.
207 this->_destroy();
208 this->_internalDeallocate();
209 this->_reset();
210 }
211
212 public:
213
214 template <Int32 N> SmallArray(SmallArray<T, N>&& rhs) = delete;
215 template <Int32 N> SmallArray<T, NbElement> operator=(SmallArray<T, N>&& rhs) = delete;
216
217 private:
218
219 char m_stack_buffer[MemorySize];
220 impl::StackMemoryAllocator m_stack_allocator;
221};
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
225
226} // namespace Arcane
227
228/*---------------------------------------------------------------------------*/
229/*---------------------------------------------------------------------------*/
230
231#endif
size_t guarantedAlignment(MemoryAllocationArgs) const final
Valeur de l'alignement garanti par l'allocateur.
Definition SmallArray.h:55
bool hasRealloc(MemoryAllocationArgs) const final
Indique si l'allocateur supporte la sémantique de realloc.
Definition SmallArray.h:50
void _initFromAllocator(IMemoryAllocator *a, Int64 acapacity)
Construit un tableau avec un allocateur spécifique a.
void _initFromSpan(const Span< const T > &view)
Initialise le tableau avec la vue view.
void _reset()
Réinitialise le tableau à un tableau vide.
Informations sur une zone mémoire allouée.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
Span< const T > constSpan() const
Vue constante sur ce tableau.
Classe contenant des informations pour spécialiser les allocations.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-