14 #ifndef odc_core_DataStream_H
15 #define odc_core_DataStream_H
26 #include "eckit/io/Buffer.h"
27 #include "eckit/io/Offset.h"
41 template<
typename T>
static void swap(T &) {}
42 static void swap(
char* addr,
size_t size) {}
49 std::reverse(
reinterpret_cast<char*
>(&o),
reinterpret_cast<char*
>(&o) +
sizeof(T));
51 static void swap(
char* addr,
size_t size) {
52 std::reverse(addr, addr+size);
58 template <
typename ByteOrder>
63 DataStream(
const void* data,
size_t size,
bool const=
true);
73 template <
typename T>
void read(T& elem);
74 template <
typename T>
void read(std::vector<T>& vec);
75 template <
typename T,
typename S>
void read(std::map<T,S>& props);
76 void read(std::string& s);
78 void read(
void* addr,
size_t bytes);
83 template <
typename T>
void write(
const T& elem);
84 template <
typename T>
void write(
const std::vector<T>& vec);
85 template <
typename T,
typename S>
void write(
const std::map<T,S>& props);
86 void write(
const std::string& s);
88 void write(
const void* addr,
size_t bytes);
89 void writeBytes(
const void* addr,
size_t bytes);
118 template <
typename ...Args>
137 template <
typename ...Args>
143 template <
typename ...Args>
149 template <
typename ...Args>
155 template <
typename ...Args>
163 std::unique_ptr<DataStream<SameByteOrder>>
sameDs_;
164 std::unique_ptr<DataStream<OtherByteOrder>>
otherDs_;
170 template <
typename ByteOrder>
173 start_(const_cast<char*>(reinterpret_cast<const char*>(data))),
175 end_(start_ + size) {}
178 template <
typename ByteOrder>
180 DataStream<ByteOrder>(buffer.data(), buffer.size()) {}
183 template <
typename ByteOrder>
188 template <
typename ByteOrder>
190 DataStream<ByteOrder>(buffer.data(), buffer.size()) {}
193 template <
typename ByteOrder>
197 template <
typename ByteOrder>
199 return static_cast<size_t>(current_ - start_);
203 template <
typename ByteOrder>
204 template <
typename T>
206 read(&elem,
sizeof(elem));
210 template <
typename ByteOrder>
211 template <
typename T>
217 for (
auto& elem : vec) read(elem);
221 template <
typename ByteOrder>
222 template <
typename T,
typename S>
227 for (int32_t
i = 0;
i <
count;
i++) {
232 props.emplace(std::move(first), std::move(second));
237 template <
typename ByteOrder>
244 readBytes(&s[0], len);
249 template <
typename ByteOrder>
251 readBytes(addr, bytes);
252 ByteOrder::swap(
reinterpret_cast<char*
>(addr), bytes);
257 template <
typename ByteOrder>
260 char* newpos = current_ + bytes;
263 std::stringstream ss;
264 ss <<
"Attempting to read " << bytes
265 <<
" bytes from DataStream with only " << (end_ - current_) <<
" bytes remaining";
269 ::memcpy(addr, current_, bytes);
274 template <
typename ByteOrder>
275 template <
typename T>
277 write(&elem,
sizeof(elem));
281 template <
typename ByteOrder>
282 template <
typename T>
284 int32_t len = vec.size();
286 for (
const auto& elem : vec)
write(elem);
290 template <
typename ByteOrder>
291 template <
typename T,
typename S>
293 int32_t len = props.size();
295 for (
const auto& kv : props) {
302 template <
typename ByteOrder>
305 int32_t len = s.length();
307 writeBytes(&s[0], len);
312 template <
typename ByteOrder>
314 writeBytes(addr, bytes);
315 ByteOrder::swap(current_ - bytes, bytes);
320 template <
typename ByteOrder>
325 char* newpos = current_ + bytes;
328 std::stringstream ss;
329 ss <<
"Attempting to write " << bytes
330 <<
" to DataStream with only " << (end_ - current_) <<
" bytes remaining";
334 ::memcpy(current_, addr, bytes);
static void count(void *counter, const double *data, size_t n)
void writeBytes(const void *addr, size_t bytes)
eckit::Offset position() const
void readBytes(void *addr, size_t bytes)
void advance(size_t nbytes)
DataStream(const void *data, size_t size, bool const=true)
void write(const T &elem)
void read(Args &&... args)
GeneralDataStream & operator=(GeneralDataStream &&rhs)=default
void writeBytes(Args &&... args)
std::unique_ptr< DataStream< SameByteOrder > > sameDs_
void readBytes(Args &&... args)
std::unique_ptr< DataStream< OtherByteOrder > > otherDs_
GeneralDataStream(bool otherByteOrder, Args &&... args)
DataStream< SameByteOrder > & same()
eckit::Offset position() const
DataStream< OtherByteOrder > & other()
void write(Args &&... args)
GeneralDataStream(GeneralDataStream &&rhs)=default
subroutine write(self, filename_in)
static void swap(char *addr, size_t size)
static void swap(T &)
With same byte order, we always to nothing!
static void swap(char *addr, size_t size)