IODA Bundle
DataStream.cc
Go to the documentation of this file.
1 #if 0
2 /*
3  * (C) Copyright 1996-2012 ECMWF.
4  *
5  * This software is licensed under the terms of the Apache Licence Version 2.0
6  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
7  * In applying this licence, ECMWF does not waive the privileges and immunities
8  * granted to it by virtue of its status as an intergovernmental organisation nor
9  * does it submit to any jurisdiction.
10  */
11 
12 ///
13 /// \file DataStream.cc
14 ///
15 /// @author Piotr Kuchta, March 2009
16 
17 #include "eckit/exception/Exceptions.h"
18 #include "eckit/io/DataHandle.h"
19 #include "eckit/io/Length.h"
20 #include "eckit/log/CodeLocation.h"
21 
22 namespace odc {
23 
24 // Can't use eckti::DataHandle&, as Currently "NonVirtual" is the baseclass of
25 // UnsafeInMemoryDataHandle... Wonderful...
26 template <typename DH>
27 inline void checkRead(int code, const char *msg, const DH& dh, const eckit::CodeLocation& loc)
28 {
29  if(code != 0)
30  {
31  std::stringstream ss;
32  ss << "DatStream(" << dh << ") failed check: " << msg;
33  throw eckit::ReadError(ss.str(), loc);
34  }
35 }
36 
37 #define CHECK_READ(d, a) \
38 { \
39  long _v; \
40  if (!(_v = (a))) { \
41  ::odc::checkRead(_v, #a, d, Here()); \
42  } \
43 }
44 
45 template <typename T, typename D>
46 DataStream<T,D>::DataStream() : f() {}
47 
48 template <typename T, typename D>
49 DataStream<T,D>::DataStream(D *dh) : f(dh) {}
50 
51 template <typename T, typename D>
52 DataStream<T,D>::DataStream(D &dh) : f(&dh) {}
53 
54 template <typename T, typename D>
55 void DataStream<T,D>::close() { f->close(); }
56 
57 template <typename T, typename D>
58 long DataStream<T,D>::read(void* p, long l) { return f->read(p, l);
59 }
60 
61 template <typename T, typename D>
62 void DataStream<T,D>::readInt32(int32_t& i)
63 {
64  CHECK_READ(*f, f->read(&i, sizeof(int32_t)) == sizeof(int32_t));
65  T::swap(i);
66 }
67 
68 template <typename T, typename D>
69 void DataStream<T,D>::readInt64(int64_t& i)
70 {
71  CHECK_READ(*f, f->read(&i, sizeof(int64_t)) == sizeof(int64_t));
72  T::swap(i);
73 }
74 
75 template <typename T, typename D>
76 void DataStream<T,D>::writeInt32(int32_t i)
77 {
78  T::swap(i);
79  ASSERT(f->write(&i, sizeof(int32_t)) == sizeof(int32_t));
80 }
81 
82 template <typename T, typename D>
83 void DataStream<T,D>::writeInt64(int64_t i)
84 {
85  T::swap(i);
86  ASSERT(f->write(&i, sizeof(int64_t)) == sizeof(int64_t));
87 }
88 
89 template <typename T, typename D>
90 void DataStream<T,D>::readInt16(int16_t& i)
91 {
92  CHECK_READ(*f, f->read(&i, sizeof(int16_t)) == sizeof(int16_t));
93  T::swap(i);
94 }
95 
96 template <typename T, typename D>
97 void DataStream<T,D>::writeInt16(int16_t i)
98 {
99  T::swap(i);
100  ASSERT(f->write(&i, sizeof(int16_t)) == sizeof(int16_t));
101 }
102 
103 template <typename T, typename D>
104 void DataStream<T,D>::readUInt16(uint16_t& i)
105 {
106  CHECK_READ(*f, f->read(&i, sizeof(uint16_t)) == sizeof(uint16_t));
107  T::swap(i);
108 }
109 
110 template <typename T, typename D>
111 void DataStream<T,D>::writeUInt16(uint16_t i)
112 {
113  T::swap(i);
114  ASSERT(f->write(&i, sizeof(uint16_t)) == sizeof(uint16_t));
115 }
116 
117 template <typename T, typename D>
118 void DataStream<T,D>::readBuffer(MemoryBlock &buffer)
119 {
120  int32_t size;
121  readInt32(size);
122  buffer.size(size);
123  CHECK_READ(*f, f->read(buffer, size) == size);
124 }
125 
126 template <typename T, typename D>
127 void DataStream<T,D>::writeBuffer(const MemoryBlock &buffer)
128 {
129  writeInt32(buffer.size());
130  eckit::Length writtenBytes = f->write(buffer, buffer.size());
131  ASSERT(long (writtenBytes) == long (buffer.size()));
132 }
133 
134 template <typename T, typename D>
135 void DataStream<T,D>::readString(std::string &s)
136 {
137  int32_t len;
138  readInt32(len);
139 
140 #ifdef _HPUX_SOURCE
141  char buff[8 * 1024 * 1024];
142  ASSERT(len < sizeof(buff));
143 #else
144  char buff[len];
145 #endif
146  CHECK_READ(*f, f->read(&buff, len) == len);
147 
148  std::string r(buff, len);
149 
150  s = r;
151 }
152 
153 template <typename T, typename D>
154 void DataStream<T,D>::writeString(const std::string &s)
155 {
156  int32_t len = s.size();
157  writeInt32(len);
158  ASSERT(f->write(s.c_str(), len) == len);
159 }
160 
161 template <typename T, typename D>
162 void DataStream<T,D>::readChar(char &c)
163 {
164  CHECK_READ(*f, f->read(&c, sizeof(char)) == sizeof(char));
165 }
166 
167 template <typename T, typename D>
168 void DataStream<T,D>::writeChar(char c)
169 {
170  size_t n = f->write(&c, sizeof(char));
171  ASSERT(n == sizeof(char));
172 }
173 
174 template <typename T, typename D>
175 void DataStream<T,D>::readUChar(unsigned char &c)
176 {
177  size_t n = f->read(&c, sizeof(unsigned char));
178  ASSERT(n == sizeof(unsigned char));
179 }
180 
181 template <typename T, typename D>
182 void DataStream<T,D>::writeUChar(const unsigned char c)
183 {
184  ASSERT(f->write(&c, sizeof(unsigned char)) == sizeof(unsigned char));
185 }
186 
187 template <typename T, typename D>
188 void DataStream<T,D>::readBytes(char *buff, size_t &len)
189 {
190  CHECK_READ(*f, f->read(buff, len) == static_cast<long>(len));
191 }
192 
193 template <typename T, typename D>
194 void DataStream<T,D>::writeBytes(const char *buff, size_t len)
195 {
196  ASSERT(f->write(buff, len) == static_cast<long>(len));
197 }
198 
199 template <typename T, typename D>
200 void DataStream<T,D>::readDouble(double &d)
201 {
202  CHECK_READ(*f, f->read(&d, sizeof(double)) == sizeof(double));
203  T::swap(d);
204 }
205 
206 template <typename T, typename D>
207 void DataStream<T,D>::writeDouble(double d)
208 {
209  T::swap(d);
210  ASSERT(f->write(&d, sizeof(double)) == sizeof(double));
211 }
212 
213 template <typename T, typename D>
214 void DataStream<T,D>::readFloat(float &d)
215 {
216  CHECK_READ(*f, f->read(&d, sizeof(float)) == sizeof(float));
217  T::swap(d);
218 }
219 
220 template <typename T, typename D>
221 void DataStream<T,D>::writeFloat(float d)
222 {
223  T::swap(d);
224  ASSERT(f->write(&d, sizeof(float)) == sizeof(float));
225 }
226 
227 template <typename T, typename D>
228 void DataStream<T,D>::readProperties(Properties &p)
229 {
230  int32_t size = 0;
231  readInt32(size);
232 
233  for (int i = 0; i < size; i++)
234  {
235  std::string key, value;
236  readString(key);
237  readString(value);
238  p[key] = value;
239  }
240 }
241 
242 template <typename T, typename D>
243 void DataStream<T,D>::writeProperties(const Properties &p)
244 {
245  int32_t size = p.size();
246  writeInt32(size);
247 
248  for(Properties::const_iterator i = p.begin(); i != p.end(); ++i)
249  {
250  writeString(i->first);
251  writeString(i->second);
252  }
253 }
254 
255 template <typename T, typename D>
256 void DataStream<T,D>::readFlags(Flags &v)
257 {
258  int32_t size = 0;
259  readInt32(size);
260 
261  v.clear();
262  v.resize(size);
263 
264  for (int32_t i = 0; i < size; ++i)
265  readDouble(v[i]);
266 }
267 
268 template <typename T, typename D>
269 void DataStream<T,D>::writeFlags(const Flags &v)
270 {
271  int32_t size = v.size();
272  writeInt32(size);
273 
274  for (int32_t i = 0; i < size; ++i)
275  writeDouble(v[i]);
276 }
277 
278 template <typename T, typename D>
279 void DataStream<T,D>::readBitfieldDef(eckit::sql::BitfieldDef &v)
280 {
281  eckit::sql::FieldNames& names = v.first;
282  eckit::sql::Sizes& sizes = v.second;
283 
284  names.clear();
285  sizes.clear();
286 
287  int32_t namesSize = 0;
288  readInt32(namesSize);
289 
290  for (int32_t i = 0; i < namesSize; i++)
291  {
292  std::string s;
293  readString(s);
294  names.push_back(s);
295  }
296 
297  int32_t sizesSize = 0;
298  readInt32(sizesSize);
299 
300  ASSERT(namesSize == sizesSize);
301 
302  for (int32_t i = 0; i < sizesSize; i++)
303  {
304  int32_t n;
305  readInt32(n);
306  sizes.push_back(n);
307  }
308 }
309 
310 template <typename T, typename D>
311 void DataStream<T,D>::writeBitfieldDef(const eckit::sql::BitfieldDef &v)
312 {
313  const eckit::sql::FieldNames& names = v.first;
314  const eckit::sql::Sizes& sizes = v.second;
315 
316  writeInt32(names.size());
317  for (size_t i = 0; i < names.size(); i++)
318  writeString(names[i]);
319 
320  writeInt32(sizes.size());
321  for (size_t i = 0; i < sizes.size(); i++)
322  writeInt32(sizes[i]);
323 }
324 
325 #undef CHECK_READ
326 
327 } // namespace odc
328 
329 
330 #endif
std::map< std::string, std::string > Properties
Definition: Header.h:35
std::vector< double > Flags
Definition: Header.h:36
Definition: ColumnInfo.h:23