1 #ifndef teca_binary_stream_h
2 #define teca_binary_stream_h
4 #include "teca_common.h"
32 {
return m_size != 0; }
36 void clear() noexcept;
39 void resize(
unsigned long n_bytes);
42 void grow(
unsigned long n_bytes);
45 unsigned char *get_data() noexcept
48 const unsigned char *get_data()
const noexcept
53 unsigned long size()
const noexcept
54 {
return m_write_p - m_data; }
58 unsigned long capacity()
const noexcept
63 void set_read_pos(
unsigned long n) noexcept
64 { m_read_p = m_data + n; }
66 void set_write_pos(
unsigned long n) noexcept
67 { m_write_p = m_data + n; }
73 template <
typename T>
void pack(T *val);
74 template <
typename T>
void pack(
const T &val);
75 template <
typename T>
void unpack(T &val);
76 template <
typename T>
void pack(
const T *val,
unsigned long n);
77 template <
typename T>
void unpack(T *val,
unsigned long n);
80 void pack(
const std::string &str);
81 void unpack(std::string &str);
83 void pack(
const std::vector<std::string> &v);
84 void unpack(std::vector<std::string> &v);
86 template<
typename T>
void pack(
const std::vector<T> &v);
87 template<
typename T>
void unpack(std::vector<T> &v);
89 template<
typename KT,
typename VT>
void pack(
const std::map<KT, VT> &v);
90 template<
typename KT,
typename VT>
void unpack(std::map<KT, VT> &v);
92 template<
typename T1,
typename T2>
void pack(
const std::pair<T1, T2> &v);
93 template<
typename T1,
typename T2>
void unpack(std::pair<T1, T2> &v);
98 template <
typename T>
int expect(
const T &val);
99 template <
typename T>
int expect(
const T *val,
unsigned long n);
100 int expect(
const char *str);
103 int broadcast(MPI_Comm comm,
int root_rank=0);
108 constexpr
unsigned int get_block_size()
112 unsigned long m_size;
113 unsigned char *m_data;
114 unsigned char *m_read_p;
115 unsigned char *m_write_p;
119 template <
typename T>
120 void teca_binary_stream::pack(T *val)
123 TECA_ERROR(
"Error: Packing a pointer.");
127 template <
typename T>
128 void teca_binary_stream::pack(
const T &val)
130 this->grow(
sizeof(T));
131 *((T *)m_write_p) = val;
132 m_write_p +=
sizeof(T);
136 template <
typename T>
137 void teca_binary_stream::unpack(T &val)
139 val = *((T *)m_read_p);
140 m_read_p +=
sizeof(T);
144 template <
typename T>
145 void teca_binary_stream::pack(
const T *val,
unsigned long n)
147 unsigned long n_bytes = n*
sizeof(T);
150 unsigned long nn = n*
sizeof(T);
151 memcpy(m_write_p, val, nn);
156 template <
typename T>
157 void teca_binary_stream::unpack(T *val,
unsigned long n)
159 unsigned long nn = n*
sizeof(T);
160 memcpy(val, m_read_p, nn);
166 void teca_binary_stream::pack(
const std::string &str)
168 unsigned long slen = str.size();
170 this->pack(str.c_str(), slen);
175 void teca_binary_stream::unpack(std::string &str)
177 unsigned long slen = 0;
181 str.assign(
reinterpret_cast<char*
>(m_read_p), slen);
188 void teca_binary_stream::pack(
const std::vector<std::string> &v)
190 unsigned long vlen = v.size();
192 for (
unsigned long i = 0; i < vlen; ++i)
198 void teca_binary_stream::unpack(std::vector<std::string> &v)
204 for (
unsigned long i = 0; i < vlen; ++i)
210 void teca_binary_stream::pack(
const std::vector<T> &v)
212 const unsigned long vlen = v.size();
214 this->pack(v.data(), vlen);
219 void teca_binary_stream::unpack(std::vector<T> &v)
225 this->unpack(v.data(), vlen);
229 template<
typename KT,
typename VT>
230 void teca_binary_stream::pack(
const std::map<KT, VT> &m)
232 unsigned long n_elem = m.size();
235 typename std::map<KT,VT>::const_iterator it = m.begin();
237 for (
unsigned long i = 0; i < n_elem; ++i)
239 this->pack(it->first);
240 this->pack(it->second);
245 template<
typename KT,
typename VT>
246 void teca_binary_stream::unpack(std::map<KT, VT> &m)
248 unsigned long n_elem = 0;
249 this->unpack(n_elem);
251 for (
unsigned long i = 0; i < n_elem; ++i)
259 m.emplace(std::move(key), std::move(val));
264 template<
typename T1,
typename T2>
265 void teca_binary_stream::pack(
const std::pair<T1, T2> &p)
268 this->pack(p.second);
272 template<
typename T1,
typename T2>
273 void teca_binary_stream::unpack(std::pair<T1, T2> &p)
275 this->unpack(p.first);
276 this->unpack(p.second);
281 int teca_binary_stream::expect(
const T &val)
294 int teca_binary_stream::expect(
const T *val,
unsigned long n)
297 T *tmp = (T*)malloc(n*
sizeof(T));
298 this->unpack(tmp, n);
299 for (
unsigned long i = 0; i < n; ++i)
301 if (tmp[i] != val[i])
313 int teca_binary_stream::expect(
const char *str)
315 unsigned long n = strlen(str);
316 char *tmp = (
char*)malloc(n);
317 this->unpack(tmp, n);
318 int same = strncmp(str, tmp, n);