Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MultiBuffer.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/* MultiBuffer.h (C) 2000-2011 */
9/* */
10/* Classe template d'un tableau avec tampon. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_MULTIBUFFER_H
13#define ARCANE_UTILS_MULTIBUFFER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ArrayView.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22ARCANE_BEGIN_NAMESPACE
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26/*!
27 * \internal
28 * \brief Tampon pour allocation multiple
29
30 Cette classe gère une liste pré-alloué d'élément afin de limiter
31 les appels multiples à des allocations (new() ou malloc()).
32
33 Les pré-allocation se font par bloc de \a m_buffer_size éléments
34
35 Pour être utilisé par cette classe, un type doit posséder un constructeur
36 par défaut et un opérateur de recopie. Cette classe garantit que les
37 pointeurs retournés restent valides tant que cette instance existe.
38
39 Les constructeurs et opérateurs de recopie ne dupliquent pas la mémoire
40 mais se contentent juste de conserver la taille du tampon.
41*/
42template<class T>
44{
45 public:
46
47 typedef UniqueArray<T> BufferType;
48
49 public:
50
52 : m_buffer_size(1000), m_current_buffer_size(0), m_nb_in_buffer(0),m_current_buffer(0)
53 {
54 }
55 MultiBufferT(Integer buf_size)
56 : m_buffer_size(buf_size), m_current_buffer_size(0), m_nb_in_buffer(0),m_current_buffer(0)
57 {
58 }
59 //! Constructeur de recopie
61 : m_buffer_size(ref.m_buffer_size), m_current_buffer_size(0), m_nb_in_buffer(0), m_current_buffer(0)
62 {
63 }
65 {
66 _freeAllocatedBuffers();
67 }
68 public:
69 //! Opérateur de recopie (interdit)
70 void operator=(const MultiBufferT<T>& ref)
71 {
72 if (&ref==this)
73 return;
74 clear();
75 m_buffer_size = ref.m_buffer_size;
76 }
77 public:
78 //! Alloue un nouvel élément
80 {
81 if (!m_current_buffer)
82 _allocateCurrentBuffer();
83 T* v = &(*m_current_buffer)[m_nb_in_buffer];
84 ++m_nb_in_buffer;
85 if (m_nb_in_buffer==m_current_buffer_size)
86 m_current_buffer = 0; // Indique que le tampon actuel est plein
87 return v;
88 }
89 //! Alloue \a n éléments
91 {
92 // Si le nombre d'éléments souhaités est supérieure à la taille
93 // du tampon, alloue spécifiquement un tampon de la bonne taille
94 if (n>m_current_buffer_size){
95 BufferType* bt = new BufferType(n);
96 m_allocated_buffers.add(bt);
97 return *bt;
98 }
99 if (!m_current_buffer)
100 _allocateCurrentBuffer();
101 // Si le tampon actuel n'est pas assez grand pour contenir les
102 // \a n éléments souhaités, en alloue un autre
103 if ((m_nb_in_buffer+n)>=m_current_buffer_size)
104 _allocateCurrentBuffer();
105 T* v = &(*m_current_buffer)[m_nb_in_buffer];
106 m_nb_in_buffer += n;
107 if (m_nb_in_buffer==m_current_buffer_size)
108 m_current_buffer = 0; // Indique que le tampon actuel est plein
109 return ArrayView<T>(n,v);
110 }
111 void clear()
112 {
113 m_nb_in_buffer = 0;
114 m_current_buffer = 0;
115 m_current_buffer_size = 0;
116 _freeAllocatedBuffers();
117
118 }
119 Integer nbAllocatedBuffer() { return m_allocated_buffers.size(); }
120 Integer bufferSize() const { return m_current_buffer_size; }
121
122 protected:
123 void _freeAllocatedBuffers()
124 {
125 for( Integer i=0, s=m_allocated_buffers.size(); i<s; ++i )
126 delete m_allocated_buffers[i];
127 m_allocated_buffers.clear();
128 }
129 private:
130 Integer m_buffer_size; //!< Nombre d'élément d'un tampon
131 Integer m_current_buffer_size; //!< Nombre d'éléments max du tampon courant
132 Integer m_nb_in_buffer; //!< Nombre d'éléments dans le tampon actuel.
133 BufferType* m_current_buffer; //!< Tampon actuel
134 UniqueArray< BufferType* > m_allocated_buffers; //!< Liste de tous les tampons
135 private:
136 void _allocateCurrentBuffer()
137 {
138 m_current_buffer = new BufferType(m_buffer_size);
139 m_current_buffer_size = m_buffer_size;
140 m_allocated_buffers.add(m_current_buffer);
141 m_nb_in_buffer = 0;
142 }
143};
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
148ARCANE_END_NAMESPACE
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153#endif
154
MultiBufferT(const MultiBufferT< T > &ref)
Constructeur de recopie.
Definition MultiBuffer.h:60
T * allocOne()
Alloue un nouvel élément.
Definition MultiBuffer.h:79
ArrayView< T > allocMany(Integer n)
Alloue n éléments.
Definition MultiBuffer.h:90
void operator=(const MultiBufferT< T > &ref)
Opérateur de recopie (interdit)
Definition MultiBuffer.h:70
Vue modifiable d'un tableau d'un type T.
Vecteur 1D de données avec sémantique par valeur (style STL).
Int32 Integer
Type représentant un entier.