Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Bzip2DeflateService.cc
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/* Bzip2DeflateService.h (C) 2000-2021 */
9/* */
10/* Service de compression utilisant la bibliothèque 'bzip2'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/IOException.h"
15#include "arcane/utils/Array.h"
16#include "arcane/utils/TraceInfo.h"
17#include "arcane/utils/IDataCompressor.h"
18
19#include "arcane/FactoryService.h"
20#include "arcane/AbstractService.h"
21#include "arcane/IDeflateService.h"
22
23#include <bzlib.h>
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
37: public AbstractService
38, public IDeflateService
39{
40 public:
43 {
44 }
45
46 public:
47
48 void build() override {}
49
51 {
52 Integer input_size = values.size();
53 // D'après la doc, il faut allouer au moins 1% de plus que la taille
54 // d'entrée plus encore 600 bytes
55 Integer compressed_init_size = (Integer)(((Real)input_size) * 1.01) + 600;
57 //compressed_values.copy(values);
58
59 char* dest = (char*)compressed_values.data();
60 unsigned int dest_len = (unsigned int)compressed_init_size;
61
62 char* source = (char*)values.data();
63 unsigned int source_len = (unsigned int)input_size;
64
65 int blockSize100k = 9;
66 int verbosity = 1;
67 int workFactor = 30;
68
69#if 0
70 info() << "CHECK COMPRESS dest=" << (void*)dest
71 << " dest_len=" << dest_len
72 << " source=" << (void*)source
73 << " source_len=" << source_len;
74#endif
75
76 int r = BZ2_bzBuffToBuffCompress(dest,
77 &dest_len,
78 source,
81 verbosity,
83 if (r!=BZ_OK)
84 throw IOException(A_FUNCINFO,String::format("io error during compression r={0}",r));
85 // Attention overflow des Int32;
86 Real ratio = 0.0;
87 if (source_len>0)
88 ratio = ((double)dest_len * 100.0 ) / (double)source_len;
89 info() << "Bzip2 compress r=" << r << " source_len=" << source_len
90 << " dest_len=" << dest_len << " ratio=" << ratio;
92 }
93
95 {
96 char* dest = (char*)values.data();
97 unsigned int dest_len = (unsigned int)values.size();
98
99 char* source = (char*)compressed_values.data();
100 unsigned int source_len = (unsigned int)compressed_values.size();
101
102 // small vaut 1 si on souhaite economiser la memoire (mais c'est moins rapide)
103 // et 0 sinon.
104 int small = 0;
105 int verbosity = 1;
107 source,source_len,
109 info() << "Bzip2 decompress r=" << r << " source_len=" << source_len
110 << " dest_len=" << dest_len;
111 if (r!=BZ_OK)
112 ARCANE_THROW(IOException,"IO error during decompression r={0}",r);
113 }
114};
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
122: public AbstractService
123, public IDataCompressor
124{
125 public:
127 : AbstractService(sbi), m_name(sbi.serviceInfo()->localName())
128 {
129 }
130
131 public:
132
133 void build() override {}
134 String name() const override { return m_name; }
135 Int64 minCompressSize() const override { return 512; }
137 {
138 Int64 input_size = values.size();
139 // D'après la doc, il faut allouer au moins 1% de plus que la taille
140 // d'entrée plus encore 600 bytes
141 Integer compressed_init_size = (Integer)(((Real)input_size) * 1.01) + 600;
143
144 char* dest = reinterpret_cast<char*>(compressed_values.data());
145 unsigned int dest_len = _toUInt(compressed_init_size);
146
147 char* source = const_cast<char*>(reinterpret_cast<const char*>(values.data()));
148 unsigned int source_len = _toUInt(input_size);
149
150 int blockSize100k = 9;
151 int verbosity = 1;
152 int workFactor = 30;
153
154 int r = BZ2_bzBuffToBuffCompress(dest,
155 &dest_len,
156 source,
159 verbosity,
160 workFactor);
161 if (r!=BZ_OK)
162 ARCANE_THROW(IOException,"IO error during compression r={0}",r);
163
164 // Attention overflow des Int32;
165 Real ratio = 0.0;
166 if (source_len>0)
167 ratio = ((double)dest_len * 100.0 ) / (double)source_len;
168 info() << "Bzip2 compress r=" << r << " source_len=" << source_len
169 << " dest_len=" << dest_len << " ratio=" << ratio;
171 }
172
174 {
175 char* dest = reinterpret_cast<char*>(values.data());
176 unsigned int dest_len = _toUInt(values.size());
177
178 char* source = const_cast<char*>(reinterpret_cast<const char*>(compressed_values.data()));
179 unsigned int source_len = _toUInt(compressed_values.size());
180
181 // small vaut 1 si on souhaite economiser la memoire (mais c'est moins rapide)
182 // et 0 sinon.
183 int small = 0;
184 int verbosity = 1;
186 source,source_len,
188 info(5) << "Bzip2 decompress r=" << r << " source_len=" << source_len
189 << " dest_len=" << dest_len;
190 if (r!=BZ_OK)
191 ARCANE_THROW(IOException,"IO error during decompression r={0}",r);
192 }
193 private:
194 String m_name;
195 private:
196 unsigned int _toUInt(Int64 vsize)
197 {
198 // Vérifie qu'on tient dans un 'int'.
199 Int64 max_uint_size = std::numeric_limits<unsigned int>::max();
200 if (vsize>max_uint_size)
201 ARCANE_THROW(IOException,"Array is too large to fit in 'unsigned int' type: size={0} max={1}",
202 vsize,max_uint_size);
203 return static_cast<unsigned int>(vsize);
204 }
205};
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209
210ARCANE_REGISTER_SERVICE(Bzip2DeflateService,
211 ServiceProperty("Bzip2",ST_Application),
212 ARCANE_SERVICE_INTERFACE(IDeflateService));
213
214ARCANE_REGISTER_SERVICE(Bzip2DataCompressor,
215 ServiceProperty("Bzip2DataCompressor",ST_Application|ST_CaseOption),
216 ARCANE_SERVICE_INTERFACE(IDataCompressor));
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
221} // End namespace Arcane
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Classe de base d'un service.
Tableau d'items de types quelconques.
Service de compression utilisant la bibliothèque 'Bzip2'.
Int64 minCompressSize() const override
Taille minimale du tableau en dessous de laquelle il n'est pas utile de compresser.
void decompress(Span< const std::byte > compressed_values, Span< std::byte > values) override
Décompresse les données compressed_values et les stocke dans values.
String name() const override
Nom de l'algorithme.
void build() override
Construction de niveau build du service.
void compress(Span< const std::byte > values, Array< std::byte > &compressed_values) override
Compresse les données values et les stocke dans compressed_values.
Service de compression utilisant la bibliothèque 'Bzip2'.
void build() override
Construction de niveau build du service.
void compress(ByteConstArrayView values, ByteArray &compressed_values) override
Compresse les données values et les stocke dans compressed_values.
void decompress(ByteConstArrayView compressed_values, ByteArrayView values) override
Décompresse les données compressed_values et les stocke dans values.
Interface d'un service permettant de compresser/décompresser des données.
Interface d'un service permettant de compresser/décompresser des données.
Exception lorsqu'une erreur d'entrée/sortie est détectée.
Definition IOException.h:32
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Structure contenant les informations pour créer un service.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ ST_Application
Le service s'utilise au niveau de l'application.
@ ST_CaseOption
Le service s'utilise au niveau du jeu de données.