Arcane  v3.14.10.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
42template<class T>
44{
45 public:
46
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 }
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:
71 {
72 if (&ref==this)
73 return;
74 clear();
75 m_buffer_size = ref.m_buffer_size;
76 }
77 public:
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 }
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:
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
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Tampon pour allocation multiple.
Definition MultiBuffer.h:44
MultiBufferT(const MultiBufferT< T > &ref)
Constructeur de recopie.
Definition MultiBuffer.h:60
Integer m_buffer_size
Nombre d'élément d'un tampon.
Integer m_nb_in_buffer
Nombre d'éléments dans le tampon actuel.
BufferType * m_current_buffer
Tampon actuel.
T * allocOne()
Alloue un nouvel élément.
Definition MultiBuffer.h:79
Integer m_current_buffer_size
Nombre d'éléments max du tampon courant.
ArrayView< T > allocMany(Integer n)
Alloue n éléments.
Definition MultiBuffer.h:90
UniqueArray< BufferType * > m_allocated_buffers
Liste de tous les tampons.
void operator=(const MultiBufferT< T > &ref)
Opérateur de recopie (interdit)
Definition MultiBuffer.h:70
Int32 Integer
Type représentant un entier.