117 #ifndef ASYNC_MSG_INCLUDED
118 #define ASYNC_MSG_INCLUDED
191 #define ASYNC_MSG_DERIVED_FROM(BASE_CLASS) \
192 bool packParent(std::ostream& os) const \
194 return BASE_CLASS::pack(os); \
196 size_t packedSizeParent(void) const \
198 return BASE_CLASS::packedSize(); \
200 bool unpackParent(std::istream& is) \
202 return BASE_CLASS::unpack(is); \
212 #define ASYNC_MSG_MEMBERS(...) \
213 bool pack(std::ostream& os) const \
215 return packParent(os) && Msg::pack(os, __VA_ARGS__); \
217 size_t packedSize(void) const \
219 return packedSizeParent() + Msg::packedSize(__VA_ARGS__); \
221 bool unpack(std::istream& is) \
223 return unpackParent(is) && Msg::unpack(is, __VA_ARGS__); \
231 #define ASYNC_MSG_NO_MEMBERS \
232 bool pack(std::ostream& os) const \
234 return packParent(os); \
236 size_t packedSize(void) const { return packedSizeParent(); } \
237 bool unpack(std::istream& is) \
239 return unpackParent(is); \
257 template <
typename T>
261 static bool pack(std::ostream& os,
const T& val) {
return val.pack(os); }
262 static size_t packedSize(
const T& val) {
return val.packedSize(); }
263 static bool unpack(std::istream& is, T& val) {
return val.unpack(is); }
267 class MsgPacker<char>
270 static bool pack(std::ostream& os,
char val)
273 return os.write(&val, 1).good();
275 static size_t packedSize(
const char& val) {
return sizeof(char); }
276 static bool unpack(std::istream& is,
char& val)
284 template <
typename T>
288 static bool pack(std::ostream& os,
const T& val)
293 o.uval = htobe64(o.uval);
294 return os.write(o.buf,
sizeof(T)).good();
297 static bool unpack(std::istream& is, T& val)
300 is.read(o.buf,
sizeof(T));
301 o.uval = be64toh(o.uval);
314 template <>
class MsgPacker<uint64_t> :
public Packer64<uint64_t> {};
315 template <>
class MsgPacker<int64_t> :
public Packer64<int64_t> {};
318 template <
typename T>
322 static bool pack(std::ostream& os,
const T& val)
327 o.uval = htobe32(o.uval);
328 return os.write(o.buf,
sizeof(T)).good();
330 static size_t packedSize(
const T& val) {
return sizeof(T); }
331 static bool unpack(std::istream& is, T& val)
334 is.read(o.buf,
sizeof(T));
335 o.uval = be32toh(o.uval);
348 template <>
class MsgPacker<uint32_t> :
public Packer32<uint32_t> {};
349 template <>
class MsgPacker<int32_t> :
public Packer32<int32_t> {};
352 template <
typename T>
356 static bool pack(std::ostream& os,
const T& val)
361 o.uval = htobe16(o.uval);
362 return os.write(o.buf,
sizeof(T)).good();
364 static size_t packedSize(
const T& val) {
return sizeof(T); }
365 static bool unpack(std::istream& is, T& val)
368 is.read(o.buf,
sizeof(T));
369 o.uval = be16toh(o.uval);
382 template <>
class MsgPacker<uint16_t> :
public Packer16<uint16_t> {};
383 template <>
class MsgPacker<int16_t> :
public Packer16<int16_t> {};
385 template <
typename T>
389 static bool pack(std::ostream& os,
const T& val)
392 return os.write(
reinterpret_cast<const char*
>(&val),
sizeof(T)).good();
394 static size_t packedSize(
const T& val) {
return sizeof(T); }
395 static bool unpack(std::istream& is, T& val)
397 is.read(
reinterpret_cast<char*
>(&val),
sizeof(T));
409 static bool pack(std::ostream& os,
const std::string& val)
412 if (val.size() > std::numeric_limits<uint16_t>::max())
416 uint16_t str_len(val.size());
418 os.write(val.c_str(), val.size());
420 static size_t packedSize(
const std::string& val)
422 return sizeof(uint16_t) + val.size();
424 static bool unpack(std::istream& is, std::string& val)
429 if (str_len > std::numeric_limits<uint16_t>::max())
434 if (is.read(buf, str_len))
436 val.assign(buf, str_len);
445 template <
typename I>
449 static bool pack(std::ostream& os,
const std::vector<I>& vec)
452 if (vec.size() > std::numeric_limits<uint16_t>::max())
457 for (
typename std::vector<I>::const_iterator it = vec.begin();
465 static size_t packedSize(
const std::vector<I>& vec)
467 size_t size =
sizeof(uint16_t);
468 for (
typename std::vector<I>::const_iterator it = vec.begin();
469 it != vec.end(); ++it)
475 static bool unpack(std::istream& is, std::vector<I>& vec)
479 if (vec_size > std::numeric_limits<uint16_t>::max())
485 vec.reserve(vec_size);
486 for (
int i=0; i<vec_size; ++i)
496 template <
typename Tag,
typename Value>
500 static bool pack(std::ostream& os,
const std::map<Tag, Value>& m)
503 if (m.size() > std::numeric_limits<uint16_t>::max())
508 for (
typename std::map<Tag,Value>::const_iterator it = m.begin();
519 size_t size =
sizeof(uint16_t);
520 for (
typename std::map<Tag, Value>::const_iterator it = m.begin();
528 static bool unpack(std::istream& is, std::map<Tag,Value>& m)
532 if (map_size > std::numeric_limits<uint16_t>::max())
538 for (
int i=0; i<map_size; ++i)
559 virtual ~Msg(
void) {}
561 bool packParent(std::ostream&)
const {
return true; }
565 virtual bool pack(std::ostream&)
const {
return true; }
566 virtual size_t packedSize(
void)
const {
return 0; }
567 virtual bool unpack(std::istream&)
const {
return true; }
569 template <
typename T>
570 bool pack(std::ostream& os,
const T& val)
const
574 template <
typename T>
579 template <
typename T>
580 bool unpack(std::istream& is, T& val)
const
585 template <
typename T1,
typename T2>
586 bool pack(std::ostream& os,
const T1& v1,
const T2& v2)
const
588 return pack(os, v1) &&
pack(os, v2);
590 template <
typename T1,
typename T2>
591 size_t packedSize(
const T1& v1,
const T2& v2)
const
595 template <
typename T1,
typename T2>
596 bool unpack(std::istream& is, T1& v1, T2& v2)
601 template <
typename T1,
typename T2,
typename T3>
602 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3)
const
606 template <
typename T1,
typename T2,
typename T3>
607 size_t packedSize(
const T1& v1,
const T2& v2,
const T3& v3)
const
611 template <
typename T1,
typename T2,
typename T3>
612 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3)
617 template <
typename T1,
typename T2,
typename T3,
typename T4>
618 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3,
623 template <
typename T1,
typename T2,
typename T3,
typename T4>
624 size_t packedSize(
const T1& v1,
const T2& v2,
const T3& v3,
629 template <
typename T1,
typename T2,
typename T3,
typename T4>
630 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3, T4& v4)
636 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
637 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3,
638 const T4& v4,
const T5& v5)
const
643 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
645 const T4& v4,
const T5& v5)
const
650 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
651 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3, T4& v4, T5& v5)
657 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
659 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3,
660 const T4& v4,
const T5& v5,
const T6& v6)
const
665 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
667 size_t packedSize(
const T1& v1,
const T2& v2,
const T3& v3,
668 const T4& v4,
const T5& v5,
const T6& v6)
const
673 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
675 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3, T4& v4, T5& v5,
682 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
683 typename T6,
typename T7>
684 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3,
685 const T4& v4,
const T5& v5,
const T6& v6,
const T7& v7)
const
690 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
691 typename T6,
typename T7>
692 size_t packedSize(
const T1& v1,
const T2& v2,
const T3& v3,
693 const T4& v4,
const T5& v5,
const T6& v6,
699 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
700 typename T6,
typename T7>
701 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3, T4& v4, T5& v5,
709 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
710 typename T6,
typename T7,
typename T8>
711 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3,
712 const T4& v4,
const T5& v5,
const T6& v6,
const T7& v7,
718 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
719 typename T6,
typename T7,
typename T8>
720 size_t packedSize(
const T1& v1,
const T2& v2,
const T3& v3,
721 const T4& v4,
const T5& v5,
const T6& v6,
722 const T7& v7,
const T8& v8)
const
727 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
728 typename T6,
typename T7,
typename T8>
729 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3, T4& v4, T5& v5,
730 T6& v6, T7& v7, T8& v8)
737 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
738 typename T6,
typename T7,
typename T8,
typename T9>
739 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3,
740 const T4& v4,
const T5& v5,
const T6& v6,
const T7& v7,
741 const T8& v8,
const T9& v9)
const
747 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
748 typename T6,
typename T7,
typename T8,
typename T9>
750 const T4& v4,
const T5& v5,
const T6& v6,
751 const T7& v7,
const T8& v8,
const T9& v9)
const
757 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
758 typename T6,
typename T7,
typename T8,
typename T9>
759 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3, T4& v4, T5& v5,
760 T6& v6, T7& v7, T8& v8, T9& v9)
767 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
768 typename T6,
typename T7,
typename T8,
typename T9,
typename T10>
769 bool pack(std::ostream& os,
const T1& v1,
const T2& v2,
const T3& v3,
770 const T4& v4,
const T5& v5,
const T6& v6,
const T7& v7,
771 const T8& v8,
const T9& v9,
const T10& v10)
const
777 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
778 typename T6,
typename T7,
typename T8,
typename T9,
typename T10>
780 const T4& v4,
const T5& v5,
const T6& v6,
781 const T7& v7,
const T8& v8,
const T9& v9,
782 const T10& v10)
const
788 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
789 typename T6,
typename T7,
typename T8,
typename T9,
typename T10>
790 bool unpack(std::istream& is, T1& v1, T2& v2, T3& v3, T4& v4, T5& v5,
791 T6& v6, T7& v7, T8& v8, T9& v9, T10& v10)