16
16
#include " xtensor-io.hpp"
17
17
#include " xfile_array.hpp"
18
18
#include " blosc.h"
19
+ #include " xio_stream_wrapper.hpp"
19
20
20
21
namespace xt
21
22
{
@@ -31,11 +32,12 @@ namespace xt
31
32
}
32
33
}
33
34
34
- template <typename T>
35
- inline xt::svector<T> load_blosc_file (std::istream & stream, bool as_big_endian)
35
+ template <typename T, class I >
36
+ inline xt::svector<T> load_blosc (I & stream, bool as_big_endian)
36
37
{
37
38
init_blosc ();
38
- std::string compressed_buffer{std::istreambuf_iterator<char >{stream}, {}};
39
+ std::string compressed_buffer;
40
+ stream.read_all (compressed_buffer);
39
41
auto compressed_size = compressed_buffer.size ();
40
42
std::size_t uncompressed_size = 0 ;
41
43
int res = blosc_cbuffer_validate (compressed_buffer.data (), compressed_size, &uncompressed_size);
@@ -60,7 +62,7 @@ namespace xt
60
62
}
61
63
62
64
template <class O , class E >
63
- inline void dump_blosc_stream (O& stream, const xexpression<E>& e, bool as_big_endian, int clevel, int shuffle, const char * cname, std::size_t blocksize)
65
+ inline void dump_blosc (O& stream, const xexpression<E>& e, bool as_big_endian, int clevel, int shuffle, const char * cname, std::size_t blocksize)
64
66
{
65
67
init_blosc ();
66
68
using value_type = typename E::value_type;
@@ -99,8 +101,8 @@ namespace xt
99
101
{
100
102
XTENSOR_THROW (std::runtime_error, " Blosc: compression error" );
101
103
}
102
- stream.write (compressed_buffer,
103
- std::streamsize (true_compressed_size) );
104
+ stream.write (compressed_buffer, std::streamsize (true_compressed_size));
105
+ stream. flush ( );
104
106
char_allocator.deallocate (compressed_buffer, max_compressed_size);
105
107
}
106
108
} // namespace detail
@@ -111,10 +113,17 @@ namespace xt
111
113
* @param stream An output stream to which to dump the data
112
114
* @param e the xexpression
113
115
*/
116
+ template <typename E, class O >
117
+ inline void dump_blosc (O& stream, const xexpression<E>& e, bool as_big_endian=is_big_endian(), int clevel=5, int shuffle=1, const char* cname="blosclz", std::size_t blocksize=0)
118
+ {
119
+ detail::dump_blosc (stream, e, as_big_endian, clevel, shuffle, cname, blocksize);
120
+ }
121
+
114
122
template <typename E>
115
123
inline void dump_blosc (std::ostream& stream, const xexpression<E>& e, bool as_big_endian=is_big_endian(), int clevel=5, int shuffle=1, const char* cname="blosclz", std::size_t blocksize=0)
116
124
{
117
- detail::dump_blosc_stream (stream, e, as_big_endian, clevel, shuffle, cname, blocksize);
125
+ auto s = xostream_wrapper (stream);
126
+ detail::dump_blosc (s, e, as_big_endian, clevel, shuffle, cname, blocksize);
118
127
}
119
128
120
129
/* *
@@ -124,14 +133,21 @@ namespace xt
124
133
* @param e the xexpression
125
134
*/
126
135
template <typename E>
127
- inline void dump_blosc (const std::string& filename, const xexpression<E>& e, bool as_big_endian=is_big_endian(), int clevel=5, int shuffle=1, const char* cname="blosclz", std::size_t blocksize=0)
136
+ inline void dump_blosc (const char * filename, const xexpression<E>& e, bool as_big_endian=is_big_endian(), int clevel=5, int shuffle=1, const char* cname="blosclz", std::size_t blocksize=0)
128
137
{
129
138
std::ofstream stream (filename, std::ofstream::binary);
130
139
if (!stream.is_open ())
131
140
{
132
- XTENSOR_THROW (std::runtime_error, " Blosc: failed to open file " + filename);
141
+ XTENSOR_THROW (std::runtime_error, std::string ( " Blosc: failed to open file " ) + filename);
133
142
}
134
- detail::dump_blosc_stream (stream, e, as_big_endian, clevel, shuffle, cname, blocksize);
143
+ auto s = xostream_wrapper (stream);
144
+ detail::dump_blosc (s, e, as_big_endian, clevel, shuffle, cname, blocksize);
145
+ }
146
+
147
+ template <typename E>
148
+ inline void dump_blosc (const std::string& filename, const xexpression<E>& e, bool as_big_endian=is_big_endian(), int clevel=5, int shuffle=1, const char* cname="blosclz", std::size_t blocksize=0)
149
+ {
150
+ dump_blosc<E>(filename.c_str (), e, as_big_endian, clevel, shuffle, cname, blocksize);
135
151
}
136
152
137
153
/* *
@@ -143,7 +159,8 @@ namespace xt
143
159
inline std::string dump_blosc (const xexpression<E>& e, bool as_big_endian=is_big_endian(), int clevel=5, int shuffle=1, const char* cname="blosclz", std::size_t blocksize=0)
144
160
{
145
161
std::stringstream stream;
146
- detail::dump_blosc_stream (stream, e, as_big_endian, clevel, shuffle, cname, blocksize);
162
+ auto s = xostream_wrapper (stream);
163
+ detail::dump_blosc (s, e, as_big_endian, clevel, shuffle, cname, blocksize);
147
164
return stream.str ();
148
165
}
149
166
@@ -156,10 +173,10 @@ namespace xt
156
173
* Fortran format
157
174
* @return xarray with contents from blosc file
158
175
*/
159
- template <typename T, layout_type L = layout_type::dynamic>
160
- inline auto load_blosc (std::istream & stream, bool as_big_endian=is_big_endian())
176
+ template <typename T, layout_type L = layout_type::dynamic, class I >
177
+ inline auto load_blosc (I & stream, bool as_big_endian=is_big_endian())
161
178
{
162
- xt::svector<T> uncompressed_buffer = detail::load_blosc_file <T>(stream, as_big_endian);
179
+ xt::svector<T> uncompressed_buffer = detail::load_blosc <T>(stream, as_big_endian);
163
180
std::vector<std::size_t > shape = {uncompressed_buffer.size ()};
164
181
auto array = adapt (std::move (uncompressed_buffer), shape);
165
182
return array;
@@ -175,14 +192,21 @@ namespace xt
175
192
* @return xarray with contents from blosc file
176
193
*/
177
194
template <typename T, layout_type L = layout_type::dynamic>
178
- inline auto load_blosc (const std::string& filename, bool as_big_endian=is_big_endian())
195
+ inline auto load_blosc (const char * filename, bool as_big_endian=is_big_endian())
179
196
{
180
197
std::ifstream stream (filename, std::ifstream::binary);
181
198
if (!stream.is_open ())
182
199
{
183
- XTENSOR_THROW (std::runtime_error, " Blosc: failed to open file " + filename);
200
+ XTENSOR_THROW (std::runtime_error, std::string ( " Blosc: failed to open file " ) + filename);
184
201
}
185
- return load_blosc<T, L>(stream, as_big_endian);
202
+ auto s = xistream_wrapper (stream);;
203
+ return load_blosc<T, L>(s, as_big_endian);
204
+ }
205
+
206
+ template <typename T, layout_type L = layout_type::dynamic>
207
+ inline auto load_blosc (const std::string& filename, bool as_big_endian=is_big_endian())
208
+ {
209
+ return load_blosc<T, L>(filename.c_str (), as_big_endian);
186
210
}
187
211
188
212
struct xio_blosc_config
@@ -230,8 +254,8 @@ namespace xt
230
254
}
231
255
};
232
256
233
- template <class E >
234
- void load_file (std::istream & stream, xexpression<E>& e, const xio_blosc_config& config)
257
+ template <class E , class I >
258
+ void load_file (I & stream, xexpression<E>& e, const xio_blosc_config& config)
235
259
{
236
260
E& ex = e.derived_cast ();
237
261
auto shape = ex.shape ();
@@ -246,8 +270,8 @@ namespace xt
246
270
}
247
271
}
248
272
249
- template <class E >
250
- void dump_file (std::ostream & stream, const xexpression<E> &e, const xio_blosc_config& config)
273
+ template <class E , class O >
274
+ void dump_file (O & stream, const xexpression<E> &e, const xio_blosc_config& config)
251
275
{
252
276
dump_blosc (stream, e, config.big_endian , config.clevel , config.shuffle , config.cname .c_str (), config.blocksize );
253
277
}
0 commit comments