17 #include "eckit/exception/Exceptions.h"
18 #include "eckit/io/DataHandle.h"
19 #include "eckit/io/Length.h"
20 #include "eckit/log/CodeLocation.h"
26 template <
typename DH>
27 inline void checkRead(
int code,
const char *msg,
const DH& dh,
const eckit::CodeLocation& loc)
32 ss <<
"DatStream(" << dh <<
") failed check: " << msg;
33 throw eckit::ReadError(ss.str(), loc);
37 #define CHECK_READ(d, a) \
41 ::odc::checkRead(_v, #a, d, Here()); \
45 template <
typename T,
typename D>
46 DataStream<T,D>::DataStream() :
f() {}
48 template <
typename T,
typename D>
49 DataStream<T,D>::DataStream(D *dh) :
f(dh) {}
51 template <
typename T,
typename D>
52 DataStream<T,D>::DataStream(D &dh) :
f(&dh) {}
54 template <
typename T,
typename D>
55 void DataStream<T,D>::close() {
f->close(); }
57 template <
typename T,
typename D>
58 long DataStream<T,D>::read(
void* p,
long l) {
return f->read(p, l);
61 template <
typename T,
typename D>
62 void DataStream<T,D>::readInt32(int32_t&
i)
64 CHECK_READ(*
f,
f->read(&
i,
sizeof(int32_t)) ==
sizeof(int32_t));
68 template <
typename T,
typename D>
69 void DataStream<T,D>::readInt64(int64_t&
i)
71 CHECK_READ(*
f,
f->read(&
i,
sizeof(int64_t)) ==
sizeof(int64_t));
75 template <
typename T,
typename D>
76 void DataStream<T,D>::writeInt32(int32_t
i)
79 ASSERT(
f->write(&
i,
sizeof(int32_t)) ==
sizeof(int32_t));
82 template <
typename T,
typename D>
83 void DataStream<T,D>::writeInt64(int64_t
i)
86 ASSERT(
f->write(&
i,
sizeof(int64_t)) ==
sizeof(int64_t));
89 template <
typename T,
typename D>
90 void DataStream<T,D>::readInt16(int16_t&
i)
92 CHECK_READ(*
f,
f->read(&
i,
sizeof(int16_t)) ==
sizeof(int16_t));
96 template <
typename T,
typename D>
97 void DataStream<T,D>::writeInt16(int16_t
i)
100 ASSERT(
f->write(&
i,
sizeof(int16_t)) ==
sizeof(int16_t));
103 template <
typename T,
typename D>
104 void DataStream<T,D>::readUInt16(uint16_t&
i)
106 CHECK_READ(*
f,
f->read(&
i,
sizeof(uint16_t)) ==
sizeof(uint16_t));
110 template <
typename T,
typename D>
111 void DataStream<T,D>::writeUInt16(uint16_t
i)
114 ASSERT(
f->write(&
i,
sizeof(uint16_t)) ==
sizeof(uint16_t));
117 template <
typename T,
typename D>
118 void DataStream<T,D>::readBuffer(MemoryBlock &buffer)
123 CHECK_READ(*
f,
f->read(buffer, size) == size);
126 template <
typename T,
typename D>
127 void DataStream<T,D>::writeBuffer(
const MemoryBlock &buffer)
129 writeInt32(buffer.size());
130 eckit::Length writtenBytes =
f->write(buffer, buffer.size());
131 ASSERT(
long (writtenBytes) ==
long (buffer.size()));
134 template <
typename T,
typename D>
135 void DataStream<T,D>::readString(std::string &s)
141 char buff[8 * 1024 * 1024];
142 ASSERT(len <
sizeof(buff));
146 CHECK_READ(*
f,
f->read(&buff, len) == len);
148 std::string r(buff, len);
153 template <
typename T,
typename D>
154 void DataStream<T,D>::writeString(
const std::string &s)
156 int32_t len = s.size();
158 ASSERT(
f->write(s.c_str(), len) == len);
161 template <
typename T,
typename D>
162 void DataStream<T,D>::readChar(
char &
c)
164 CHECK_READ(*
f,
f->read(&
c,
sizeof(
char)) ==
sizeof(
char));
167 template <
typename T,
typename D>
168 void DataStream<T,D>::writeChar(
char c)
170 size_t n =
f->write(&
c,
sizeof(
char));
171 ASSERT(n ==
sizeof(
char));
174 template <
typename T,
typename D>
175 void DataStream<T,D>::readUChar(
unsigned char &
c)
177 size_t n =
f->read(&
c,
sizeof(
unsigned char));
178 ASSERT(n ==
sizeof(
unsigned char));
181 template <
typename T,
typename D>
182 void DataStream<T,D>::writeUChar(
const unsigned char c)
184 ASSERT(
f->write(&
c,
sizeof(
unsigned char)) ==
sizeof(
unsigned char));
187 template <
typename T,
typename D>
188 void DataStream<T,D>::readBytes(
char *buff,
size_t &len)
190 CHECK_READ(*
f,
f->read(buff, len) ==
static_cast<long>(len));
193 template <
typename T,
typename D>
194 void DataStream<T,D>::writeBytes(
const char *buff,
size_t len)
196 ASSERT(
f->write(buff, len) ==
static_cast<long>(len));
199 template <
typename T,
typename D>
200 void DataStream<T,D>::readDouble(
double &
d)
202 CHECK_READ(*
f,
f->read(&
d,
sizeof(
double)) ==
sizeof(
double));
206 template <
typename T,
typename D>
207 void DataStream<T,D>::writeDouble(
double d)
210 ASSERT(
f->write(&
d,
sizeof(
double)) ==
sizeof(
double));
213 template <
typename T,
typename D>
214 void DataStream<T,D>::readFloat(
float &
d)
216 CHECK_READ(*
f,
f->read(&
d,
sizeof(
float)) ==
sizeof(
float));
220 template <
typename T,
typename D>
221 void DataStream<T,D>::writeFloat(
float d)
224 ASSERT(
f->write(&
d,
sizeof(
float)) ==
sizeof(
float));
227 template <
typename T,
typename D>
228 void DataStream<T,D>::readProperties(
Properties &p)
233 for (
int i = 0;
i < size;
i++)
235 std::string
key, value;
242 template <
typename T,
typename D>
243 void DataStream<T,D>::writeProperties(
const Properties &p)
245 int32_t size = p.size();
248 for(Properties::const_iterator
i = p.begin();
i != p.end(); ++
i)
250 writeString(
i->first);
251 writeString(
i->second);
255 template <
typename T,
typename D>
256 void DataStream<T,D>::readFlags(
Flags &v)
264 for (int32_t
i = 0;
i < size; ++
i)
268 template <
typename T,
typename D>
269 void DataStream<T,D>::writeFlags(
const Flags &v)
271 int32_t size = v.size();
274 for (int32_t
i = 0;
i < size; ++
i)
278 template <
typename T,
typename D>
279 void DataStream<T,D>::readBitfieldDef(eckit::sql::BitfieldDef &v)
281 eckit::sql::FieldNames& names = v.first;
282 eckit::sql::Sizes& sizes = v.second;
287 int32_t namesSize = 0;
288 readInt32(namesSize);
290 for (int32_t
i = 0;
i < namesSize;
i++)
297 int32_t sizesSize = 0;
298 readInt32(sizesSize);
300 ASSERT(namesSize == sizesSize);
302 for (int32_t
i = 0;
i < sizesSize;
i++)
310 template <
typename T,
typename D>
311 void DataStream<T,D>::writeBitfieldDef(
const eckit::sql::BitfieldDef &v)
313 const eckit::sql::FieldNames& names = v.first;
314 const eckit::sql::Sizes& sizes = v.second;
316 writeInt32(names.size());
317 for (
size_t i = 0;
i < names.size();
i++)
318 writeString(names[
i]);
320 writeInt32(sizes.size());
321 for (
size_t i = 0;
i < sizes.size();
i++)
322 writeInt32(sizes[
i]);
std::map< std::string, std::string > Properties
std::vector< double > Flags