16 #include <tbb/tbb_allocator.h>
34 typedef unsigned char Byte;
35 typedef std::vector<Byte, tbb::tbb_allocator<Byte> >
ByteBuffer;
37 static const int theHeaderSize = (
sizeof(
unsigned short) +
sizeof(
char)) * 2;
40 #define packSizeOf(type) ((sizeof(type)-1)<<4)
43 #define unpackSizeOf(dataType) (((dataType)>>4)+1)
46 #define isSimpleType(dataType) ((dataType)<128)
86 DtMessage(
unsigned short classId = 0,
unsigned short functionId = 0);
103 void printDebugMessageContents(std::ostream&);
106 const char* dataTypeName(
unsigned char dataType);
109 unsigned short classId()
const;
112 unsigned short functionId()
const;
115 const Byte*
data()
const;
130 void serializeHeader(
unsigned short classId,
unsigned short functionId);
134 bool serializeWriteOut()
const;
138 void setSerializeWriteOut(
bool writeOut);
183 DtMessage& operator << (const std::pair<void*, int>& rawData);
194 bool canReadData()
const;
198 unsigned char nextDataType()
const;
204 unsigned int nextDataSize()
const;
208 const void* nextDataPointer()
const;
211 void skipToNextData();
215 void advanceRead(
size_t bytes);
220 void getData(
int dataType,
void* output);
229 template <
typename T1>
235 template <
typename T1,
typename T2>
241 template <
typename T1,
typename T2,
typename T3>
244 *
this << t1 << t2 << t3;
247 template <
typename T1,
typename T2,
typename T3,
typename T4>
250 *
this << t1 << t2 << t3 << t4;
253 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
256 *
this << t1 << t2 << t3 << t4 << t5;
259 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
261 void addMultiple(
T1 t1,
T2 t2,
T3 t3,T4 t4,T5 t5,T6 t6)
263 *
this << t1 << t2 << t3 << t4 << t5 << t6;
266 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
267 typename T6,
typename T7>
268 void addMultiple(
T1 t1,
T2 t2,
T3 t3,T4 t4,T5 t5,T6 t6,T7 t7)
270 *
this << t1 << t2 << t3 << t4 << t5 << t6 << t7;
273 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
274 typename T6,
typename T7,
typename T8>
275 void addMultiple(
T1 t1,
T2 t2,
T3 t3,T4 t4,T5 t5,T6 t6,T7 t7,T8 t8)
277 *
this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
284 template <
typename T1>
290 template <
typename T1,
typename T2>
296 template <
typename T1,
typename T2,
typename T3>
299 *
this >> t1 >> t2 >> t3;
302 template <
typename T1,
typename T2,
typename T3,
typename T4>
305 *
this >> t1 >> t2 >> t3 >> t4;
308 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
309 void readMultiple(
T1&
t1,
T2& t2,
T3& t3,T4& t4,T5& t5)
311 *
this >> t1 >> t2 >> t3 >> t4 >> t5;
314 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
316 void readMultiple(
T1&
t1,
T2& t2,
T3& t3,T4& t4,T5& t5,T6& t6)
318 *
this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6;
321 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
322 typename T6,
typename T7>
323 void readMultiple(
T1&
t1,
T2& t2,
T3& t3,T4& t4,T5& t5,T6& t6,T7& t7)
325 *
this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7;
328 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
329 typename T6,
typename T7,
typename T8>
330 void readMultiple(
T1&
t1,
T2& t2,
T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8)
332 *
this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8;
336 template <
typename T1>
339 if(mySerializeWriteOutFlag)
345 template <
typename T1,
typename T2>
348 if(mySerializeWriteOutFlag)
354 template <
typename T1,
typename T2,
typename T3>
357 if(mySerializeWriteOutFlag)
358 *
this >> t1 >> t2 >> t3;
360 *
this << t1 << t2 << t3;
363 template <
typename T1,
typename T2,
typename T3,
typename T4>
366 if(mySerializeWriteOutFlag)
367 *
this >> t1 >> t2 >> t3 >> t4;
369 *
this << t1 << t2 << t3 << t4;
372 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
375 if(mySerializeWriteOutFlag)
376 *
this >> t1 >> t2 >> t3 >> t4 >> t5;
378 *
this << t1 << t2 << t3 << t4 << t5;
381 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
383 void serialize(
T1&
t1,
T2& t2,
T3& t3,T4& t4,T5& t5,T6& t6)
385 if(mySerializeWriteOutFlag)
386 *
this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6;
388 *
this << t1 << t2 << t3 << t4 << t5 << t6;
391 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
392 typename T6,
typename T7>
393 void serialize(
T1&
t1,
T2& t2,
T3& t3,T4& t4,T5& t5,T6& t6,T7& t7)
395 if(mySerializeWriteOutFlag)
396 *
this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7;
398 *
this << t1 << t2 << t3 << t4 << t5 << t6 << t7;
401 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
402 typename T6,
typename T7,
typename T8>
403 void serialize(
T1&
t1,
T2& t2,
T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8)
405 if(mySerializeWriteOutFlag)
406 *
this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8;
408 *
this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
412 template <
typename T>
413 void serializeViaArchive(T&
t)
418 class FastStringBuf :
public std::stringbuf
421 const char* c_str()
const {
return pbase();}
424 return pptr() - pbase();
428 std::pair<void*,int> configMemory;
430 if(serializeWriteOut())
433 serialize(configMemory);
435 std::istringstream memoryStream;
437 memoryStream.str(
std::string((
char*)configMemory.first,configMemory.second));
444 delete[] (
char*)configMemory.first;
450 FastStringBuf fastBuffer;
452 std::ostream memoryStream(&fastBuffer);
459 configMemory.first = (
void*) fastBuffer.c_str();
460 configMemory.second = fastBuffer.outputSize();
462 serialize(configMemory);
469 void setClassId(
unsigned short classId);
472 void setFunctionId(
unsigned short functionId);