Arcane  v3.14.10.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-2023 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-2023 */
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 IMemoryAllocator
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() const final;
51 void* allocate(size_t new_size) final;
52 void* reallocate(void* current_ptr, size_t new_size) final;
53 void deallocate(void* ptr) final;
54 size_t adjustCapacity(size_t wanted_capacity, size_t) final
55 {
56 return wanted_capacity;
57 }
58 size_t guarantedAlignment() final { return 0; }
59
60 private:
61
62 void* m_preallocated_buffer = nullptr;
63 size_t m_preallocated_size = 0;
64};
65
66} // namespace Arcane::impl
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
71namespace Arcane
72{
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76/*!
77 * \ingroup Collection
78 *
79 * \brief Tableau 1D de données avec buffer pré-alloué sur la pile.
80 *
81 * Cette classe s'utilise comme UniqueArray mais contient un buffer de taille
82 * fixe pour conserver \a NbElement éléments qui est utilisé si le tableau contient
83 * au plus \a NbElement éléments. Cela permet d'éviter des allocations dynamiques
84 * lorsque le nombre d'éléments est faible.
85 *
86 * Si le tableau doit contenir plus de \a NbElement éléments, alors on utilise
87 * une allocation dynamique standard.
88 */
89template <typename T, Int32 NbElement = 32>
90class SmallArray final
91: public Array<T>
92{
93 using BaseClassType = AbstractArray<T>;
94 static constexpr Int32 SizeOfType = static_cast<Int32>(sizeof(T));
95 static constexpr Int32 nb_element_in_buf = NbElement;
96
97 public:
98
99 using typename BaseClassType::ConstReferenceType;
100 static constexpr Int32 MemorySize = NbElement * SizeOfType;
101
102 public:
103
104 //! Créé un tableau vide
105 SmallArray()
106 : m_stack_allocator(m_stack_buffer, MemorySize)
107 {
108 this->_initFromAllocator(&m_stack_allocator, nb_element_in_buf);
109 }
110
111 //! Créé un tableau de \a size éléments contenant la valeur \a value.
112 SmallArray(Int64 req_size, ConstReferenceType value)
113 : SmallArray()
114 {
115 this->_resize(req_size, value);
116 }
117
118 //! Créé un tableau de \a asize éléments contenant la valeur par défaut du type T()
119 explicit SmallArray(Int64 asize)
120 : SmallArray()
121 {
122 this->_resize(asize);
123 }
124
125 //! Créé un tableau de \a asize éléments contenant la valeur par défaut du type T()
126 explicit SmallArray(Int32 asize)
127 : SmallArray((Int64)asize)
128 {
129 }
130
131 //! Créé un tableau de \a asize éléments contenant la valeur par défaut du type T()
132 explicit SmallArray(size_t asize)
133 : SmallArray((Int64)asize)
134 {
135 }
136
137 //! Créé un tableau en recopiant les valeurs de la value \a aview.
138 SmallArray(const ConstArrayView<T>& aview)
139 : SmallArray(Span<const T>(aview))
140 {
141 }
142
143 //! Créé un tableau en recopiant les valeurs de la value \a aview.
144 SmallArray(const Span<const T>& aview)
145 : SmallArray()
146 {
147 this->_initFromSpan(aview);
148 }
149
150 //! Créé un tableau en recopiant les valeurs de la value \a aview.
151 SmallArray(const ArrayView<T>& aview)
152 : SmallArray(Span<const T>(aview))
153 {
154 }
155
156 //! Créé un tableau en recopiant les valeurs de la value \a aview.
157 SmallArray(const Span<T>& aview)
158 : SmallArray(Span<const T>(aview))
159 {
160 }
161
162 SmallArray(std::initializer_list<T> alist)
163 : SmallArray()
164 {
165 this->_initFromInitializerList(alist);
166 }
167
168 //! Créé un tableau en recopiant les valeurs \a rhs.
169 SmallArray(const Array<T>& rhs)
170 : SmallArray(rhs.constSpan())
171 {
172 }
173
174 //! Copie les valeurs de \a rhs dans cette instance.
175 void operator=(const Array<T>& rhs)
176 {
177 this->copy(rhs.constSpan());
178 }
179
180 //! Copie les valeurs de la vue \a rhs dans cette instance.
181 void operator=(const ArrayView<T>& rhs)
182 {
183 this->copy(rhs);
184 }
185
186 //! Copie les valeurs de la vue \a rhs dans cette instance.
187 void operator=(const Span<T>& rhs)
188 {
189 this->copy(rhs);
190 }
191
192 //! Copie les valeurs de la vue \a rhs dans cette instance.
193 void operator=(const ConstArrayView<T>& rhs)
194 {
195 this->copy(rhs);
196 }
197
198 //! Copie les valeurs de la vue \a rhs dans cette instance.
199 void operator=(const Span<const T>& rhs)
200 {
201 this->copy(rhs);
202 }
203
204 //! Détruit l'instance.
205 ~SmallArray() override
206 {
207 // Il faut détruire explicitement car notre allocateur
208 // sera détruit avant la classe de base et ne sera plus valide
209 // lors de la désallocation.
210 this->_destroy();
211 this->_internalDeallocate();
212 this->_reset();
213 }
214
215 public:
216
217 template <Int32 N> SmallArray(SmallArray<T, N>&& rhs) = delete;
218 template <Int32 N> SmallArray<T, NbElement> operator=(SmallArray<T, N>&& rhs) = delete;
219
220 private:
221
222 char m_stack_buffer[MemorySize];
223 impl::StackMemoryAllocator m_stack_allocator;
224};
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
229} // namespace Arcane
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
234#endif
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.
Classe de base des vecteurs 1D de données.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
Span< const T > constSpan() const
Vue constante sur ce tableau.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-