1 #ifndef teca_binary_stream_h
2 #define teca_binary_stream_h
4 #include "teca_config.h"
33 {
return m_size != 0; }
37 void clear() noexcept;
40 void resize(
unsigned long n_bytes);
43 void grow(
unsigned long n_bytes);
46 unsigned char *get_data() noexcept
49 const unsigned char *get_data()
const noexcept
54 unsigned long size()
const noexcept
55 {
return m_write_p - m_data; }
59 unsigned long capacity()
const noexcept
64 void set_read_pos(
unsigned long n) noexcept
65 { m_read_p = m_data + n; }
67 void set_write_pos(
unsigned long n) noexcept
68 { m_write_p = m_data + n; }
74 template <
typename T>
void pack(T *val);
75 template <
typename T>
void pack(
const T &val);
76 template <
typename T>
void unpack(T &val);
77 template <
typename T>
void pack(
const T *val,
unsigned long n);
78 template <
typename T>
void unpack(T *val,
unsigned long n);
81 void pack(
const std::string *v,
unsigned long n);
82 void unpack(std::string *v,
unsigned long n);
84 void pack(
const std::string &str);
85 void unpack(std::string &str);
87 void pack(
const std::vector<std::string> &v);
88 void unpack(std::vector<std::string> &v);
90 template<
typename T>
void pack(
const std::vector<T> &v);
91 template<
typename T>
void unpack(std::vector<T> &v);
93 template<
typename KT,
typename VT>
void pack(
const std::map<KT, VT> &v);
94 template<
typename KT,
typename VT>
void unpack(std::map<KT, VT> &v);
96 template<
typename T1,
typename T2>
void pack(
const std::pair<T1, T2> &v);
97 template<
typename T1,
typename T2>
void unpack(std::pair<T1, T2> &v);
102 template <
typename T>
int expect(
const T &val);
103 template <
typename T>
int expect(
const T *val,
unsigned long n);
104 int expect(
const char *str);
107 int broadcast(MPI_Comm comm,
int root_rank=0);
112 constexpr
unsigned int get_block_size()
116 unsigned long m_size;
117 unsigned char *m_data;
118 unsigned char *m_read_p;
119 unsigned char *m_write_p;
123 template <
typename T>
124 void teca_binary_stream::pack(T *val)
131 template <
typename T>
132 void teca_binary_stream::pack(
const T &val)
134 this->grow(
sizeof(T));
135 *((T *)m_write_p) = val;
136 m_write_p +=
sizeof(T);
140 template <
typename T>
141 void teca_binary_stream::unpack(T &val)
143 val = *((T *)m_read_p);
144 m_read_p +=
sizeof(T);
148 template <
typename T>
149 void teca_binary_stream::pack(
const T *val,
unsigned long n)
151 unsigned long n_bytes = n*
sizeof(T);
154 unsigned long nn = n*
sizeof(T);
155 memcpy(m_write_p, val, nn);
160 template <
typename T>
161 void teca_binary_stream::unpack(T *val,
unsigned long n)
163 unsigned long nn = n*
sizeof(T);
164 memcpy(val, m_read_p, nn);
170 void teca_binary_stream::pack(
const std::string *v,
unsigned long n)
172 for (
unsigned long i = 0; i < n; ++i)
178 void teca_binary_stream::unpack(std::string *v,
unsigned long n)
180 for (
unsigned long i = 0; i < n; ++i)
186 void teca_binary_stream::pack(
const std::string &str)
188 unsigned long slen = str.size();
190 this->pack(str.c_str(), slen);
195 void teca_binary_stream::unpack(std::string &str)
197 unsigned long slen = 0;
201 str.assign(
reinterpret_cast<char*
>(m_read_p), slen);
208 void teca_binary_stream::pack(
const std::vector<std::string> &v)
210 unsigned long vlen = v.size();
212 for (
unsigned long i = 0; i < vlen; ++i)
218 void teca_binary_stream::unpack(std::vector<std::string> &v)
224 for (
unsigned long i = 0; i < vlen; ++i)
230 void teca_binary_stream::pack(
const std::vector<T> &v)
232 const unsigned long vlen = v.size();
234 this->pack(v.data(), vlen);
239 void teca_binary_stream::unpack(std::vector<T> &v)
245 this->unpack(v.data(), vlen);
249 template<
typename KT,
typename VT>
250 void teca_binary_stream::pack(
const std::map<KT, VT> &m)
252 unsigned long n_elem = m.size();
255 typename std::map<KT,VT>::const_iterator it = m.begin();
257 for (
unsigned long i = 0; i < n_elem; ++i)
259 this->pack(it->first);
260 this->pack(it->second);
265 template<
typename KT,
typename VT>
266 void teca_binary_stream::unpack(std::map<KT, VT> &m)
268 unsigned long n_elem = 0;
269 this->unpack(n_elem);
271 for (
unsigned long i = 0; i < n_elem; ++i)
279 m.emplace(std::move(key), std::move(val));
284 template<
typename T1,
typename T2>
285 void teca_binary_stream::pack(
const std::pair<T1, T2> &p)
288 this->pack(p.second);
292 template<
typename T1,
typename T2>
293 void teca_binary_stream::unpack(std::pair<T1, T2> &p)
295 this->unpack(p.first);
296 this->unpack(p.second);
301 int teca_binary_stream::expect(
const T &val)
314 int teca_binary_stream::expect(
const T *val,
unsigned long n)
317 T *tmp = (T*)malloc(n*
sizeof(T));
318 this->unpack(tmp, n);
319 for (
unsigned long i = 0; i < n; ++i)
321 if (tmp[i] != val[i])
333 int teca_binary_stream::expect(
const char *str)
335 unsigned long n = strlen(str);
336 char *tmp = (
char*)malloc(n);
337 this->unpack(tmp, n);
338 int same = strncmp(str, tmp, n);