1616#include " xtensor-io.hpp"
1717#include " xfile_array.hpp"
1818#include " blosc.h"
19+ #include " xio_stream_wrapper.hpp"
1920
2021namespace xt
2122{
@@ -31,11 +32,12 @@ namespace xt
3132 }
3233 }
3334
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)
3637 {
3738 init_blosc ();
38- std::string compressed_buffer{std::istreambuf_iterator<char >{stream}, {}};
39+ std::string compressed_buffer;
40+ stream.read_all (compressed_buffer);
3941 auto compressed_size = compressed_buffer.size ();
4042 std::size_t uncompressed_size = 0 ;
4143 int res = blosc_cbuffer_validate (compressed_buffer.data (), compressed_size, &uncompressed_size);
@@ -60,7 +62,7 @@ namespace xt
6062 }
6163
6264 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)
6466 {
6567 init_blosc ();
6668 using value_type = typename E::value_type;
@@ -99,8 +101,8 @@ namespace xt
99101 {
100102 XTENSOR_THROW (std::runtime_error, " Blosc: compression error" );
101103 }
102- stream.write (compressed_buffer,
103- std::streamsize (true_compressed_size) );
104+ stream.write (compressed_buffer, std::streamsize (true_compressed_size));
105+ stream. flush ( );
104106 char_allocator.deallocate (compressed_buffer, max_compressed_size);
105107 }
106108 } // namespace detail
@@ -111,10 +113,17 @@ namespace xt
111113 * @param stream An output stream to which to dump the data
112114 * @param e the xexpression
113115 */
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+
114122 template <typename E>
115123 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)
116124 {
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);
118127 }
119128
120129 /* *
@@ -124,14 +133,21 @@ namespace xt
124133 * @param e the xexpression
125134 */
126135 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)
128137 {
129138 std::ofstream stream (filename, std::ofstream::binary);
130139 if (!stream.is_open ())
131140 {
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);
133142 }
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);
135151 }
136152
137153 /* *
@@ -143,7 +159,8 @@ namespace xt
143159 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)
144160 {
145161 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);
147164 return stream.str ();
148165 }
149166
@@ -156,10 +173,10 @@ namespace xt
156173 * Fortran format
157174 * @return xarray with contents from blosc file
158175 */
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())
161178 {
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);
163180 std::vector<std::size_t > shape = {uncompressed_buffer.size ()};
164181 auto array = adapt (std::move (uncompressed_buffer), shape);
165182 return array;
@@ -175,14 +192,21 @@ namespace xt
175192 * @return xarray with contents from blosc file
176193 */
177194 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())
179196 {
180197 std::ifstream stream (filename, std::ifstream::binary);
181198 if (!stream.is_open ())
182199 {
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);
184201 }
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);
186210 }
187211
188212 struct xio_blosc_config
@@ -230,8 +254,8 @@ namespace xt
230254 }
231255 };
232256
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)
235259 {
236260 E& ex = e.derived_cast ();
237261 auto shape = ex.shape ();
@@ -246,8 +270,8 @@ namespace xt
246270 }
247271 }
248272
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)
251275 {
252276 dump_blosc (stream, e, config.big_endian , config.clevel , config.shuffle , config.cname .c_str (), config.blocksize );
253277 }
0 commit comments