13 #include <stk_util/util/Marshal.hpp> 20 typedef std::map<uint32_t, std::string> TypeNameMap;
22 bool s_crcInitialized =
false;
23 uint32_t s_crcTable[256];
24 TypeNameMap s_typeNameMap;
34 for(
int i = 1; i < (c + 1); i++) {
36 value |= (1 << (c - i));
47 s_crcInitialized =
true;
50 uint32_t polynomial = 0x04C11DB7;
52 std::fill(s_crcTable, s_crcTable + 256, 0);
55 for (
int i = 0; i <= 0xFF; i++) {
56 s_crcTable[i] = crc32_reflect(i, 8) << 24;
58 for (
int j = 0; j < 8; j++)
59 s_crcTable[i] = (s_crcTable[i] << 1) ^ ((s_crcTable[i] & (1u << 31)) ? polynomial : 0);
61 s_crcTable[i] = crc32_reflect(s_crcTable[i], 32);
69 const unsigned char * s,
73 crc = (crc >> 8)^s_crcTable[(crc & 0xFF)^*s++];
79 const unsigned char * s,
82 uint32_t crc = 0xffffffff;
83 crc32_part(crc, s, l);
84 return crc ^ 0xffffffff;
90 std::stringstream & os,
91 const std::type_info & typeinfo)
93 if (!s_crcInitialized)
96 const char *name = typeinfo.name();
97 unsigned length = std::strlen(name);
99 uint32_t crc = crc32((
const unsigned char *) name, length);
101 TypeNameMap::iterator it = s_typeNameMap.find(crc);
102 if (it == s_typeNameMap.end())
103 s_typeNameMap.insert(std::make_pair(crc, std::string(name)));
105 os.write((
const char *) &crc,
sizeof(uint32_t));
111 std::stringstream & is,
112 const std::type_info & typeinfo)
114 if (!s_crcInitialized)
117 const char *name = typeinfo.name();
118 unsigned length = std::strlen(name);
120 uint32_t crc_check = crc32((
const unsigned char *) name, length);
124 TypeNameMap::iterator it = s_typeNameMap.find(crc_check);
125 if (it == s_typeNameMap.end())
126 s_typeNameMap.insert(std::make_pair(crc_check, std::string(name)));
129 is.read((
char *) &crc,
sizeof(uint32_t));
131 if (crc_check != crc) {
132 std::ostringstream ss;
133 ss <<
"Marshaller encountered type ";
134 TypeNameMap::const_iterator it = s_typeNameMap.find(crc);
135 if (it == s_typeNameMap.end())
136 ss <<
"code " << std::hex << crc;
140 ss <<
" when expecting type ";
141 it = s_typeNameMap.find(crc_check);
142 if (it == s_typeNameMap.end())
143 ss <<
"code " << std::hex << crc_check;
147 throw std::runtime_error(ss.str());
155 : stream(
std::ios_base::out),
156 m_typeCheck(TYPE_CHECK_NONE)
158 (*this) << type_check;
164 const std::string & s)
165 : stream(s,
std::ios_base::in),
166 m_typeCheck(TYPE_CHECK_NONE)
182 return stream.str().size();
186 Marshal::operator
void * ()
const 188 return static_cast<void *
>(
const_cast<std::stringstream*
>(&stream));
194 const char * address,
197 stream.write(address, byte_count);
206 stream.read(address, byte_count);
212 crc32_write(mout.
stream, t);
218 crc32_check(min.stream, t);
223 Marshal &operator<<(Marshal &mout,
const signed char &t) {
224 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
226 return write(mout, t);
230 Marshal &
operator<<(Marshal &mout,
const unsigned char &t) {
231 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
233 return write(mout, t);
237 Marshal &
operator<<(Marshal &mout,
const char &t) {
238 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
240 return write(mout, t);
244 Marshal &
operator<<(Marshal &mout,
const short &t) {
245 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
247 return write(mout, t);
251 Marshal &
operator<<(Marshal &mout,
const unsigned short &t) {
252 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
254 return write(mout, t);
258 Marshal &
operator<<(Marshal &mout,
const int &t) {
259 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
261 return write(mout, t);
265 Marshal &
operator<<(Marshal &mout,
const unsigned int &t) {
266 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
268 return write(mout, t);
272 Marshal &
operator<<(Marshal &mout,
const long &t) {
273 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
275 return write(mout, t);
279 Marshal &
operator<<(Marshal &mout,
const unsigned long &t) {
280 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
282 return write(mout, t);
286 Marshal &
operator<<(Marshal &mout,
const long long &t) {
287 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
289 return write(mout, t);
293 Marshal &
operator<<(Marshal &mout,
const unsigned long long &t) {
294 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
296 return write(mout, t);
300 Marshal &
operator<<(Marshal &mout,
const float &t) {
301 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
303 return write(mout, t);
307 Marshal &
operator<<(Marshal &mout,
const double &t) {
308 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
310 return write(mout, t);
314 Marshal &
operator<<(Marshal &mout,
const std::string &s) {
315 if (mout.m_typeCheck & Marshal::TYPE_CHECK_POD)
318 size_t ul = s.size();
320 mout.stream.write(s.data(), s.size());
326 Marshal &operator>>(Marshal &min,
signed char &t) {
327 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
333 Marshal &operator>>(Marshal &min,
unsigned char &t) {
334 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
340 Marshal &operator>>(Marshal &min,
char &t) {
341 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
347 Marshal &operator>>(Marshal &min,
short &t) {
348 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
354 Marshal &operator>>(Marshal &min,
unsigned short &t) {
355 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
361 Marshal &operator>>(Marshal &min,
int &t) {
362 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
368 Marshal &operator>>(Marshal &min,
unsigned int &t) {
369 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
375 Marshal &operator>>(Marshal &min,
long &t) {
376 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
382 Marshal &operator>>(Marshal &min,
unsigned long &t) {
383 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
389 Marshal &operator>>(Marshal &min,
long long &t) {
390 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
396 Marshal &operator>>(Marshal &min,
unsigned long long &t) {
397 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
403 Marshal &operator>>(Marshal &min,
float &t) {
404 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
410 Marshal &operator>>(Marshal &min,
double &t) {
411 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
417 Marshal &operator>>(Marshal &min, std::string &s) {
418 if (min.m_typeCheck & Marshal::TYPE_CHECK_POD)
423 std::vector<char> c(size);
425 min.stream.read(&c[0], size);
426 s.assign(&c[0], size);
size_t size() const
Member function size returns the byte count of the string of packed bytes creates by put-to operation...
Marshal(unsigned type_check=TYPE_CHECK_NONE)
void write(const char *address, size_t byte_count)
Member function write writer bytes to the packed byte stream.
Struct Marshal is a data packer for sending and receiving parallel messages. The data put-to (<<) is ...
std::ostream & operator<<(std::ostream &s, const Bucket &k)
Print the part names for which this bucket is a subset.
std::string str() const
Member function str returns the string of packed bytes created by put-to operations to the stream...
std::stringstream stream
Packed byte stream to put-to or get-from.
unsigned m_typeCheck
Type checking to activate.
void read(char *address, size_t byte_count)
Member function read reads bytes from the packed byte stream.