5#ifndef _MSG_SERIALIZE_H
6#define _MSG_SERIALIZE_H
34#define CHECK_UNSUPPORTED_CONTAINER
35#ifdef CHECK_UNSUPPORTED_CONTAINER
38#include <forward_list>
41#include <unordered_set>
42#include <unordered_map>
47 template <
typename U,
typename V>
50 template <
typename T,
typename Alloc>
53 template <
typename T,
typename Alloc>
56 template <
typename T,
typename Alloc>
59 template <
typename T,
typename Alloc>
62 template <
typename T,
typename Alloc>
65 template <
typename T,
typename Hash,
typename KeyEqual,
typename Alloc>
68 template <
typename Key,
typename T,
typename Hash,
typename KeyEqual,
typename Alloc>
71 template <
typename Key,
typename T,
typename Hash,
typename KeyEqual,
typename Alloc>
162 const static int n = 1;
163 const static bool le= (* (
char *)&n == 1);
170 std::istream&
readEndian(std::istream& is,
bool& littleEndian)
174 is.read((
char*) &littleEndian,
sizeof(littleEndian));
183 bool littleEndian =
LE();
185 os.write((
const char*) &littleEndian,
sizeof(littleEndian));
195 std::istream&
read (std::istream& is,
I* t_)
197 if (check_stop_parse(is))
200 if (check_pointer(is, t_))
205 std::streampos startPos = is.tellg();
207 read(is, size,
false);
210 push_stop_parse_pos(startPos + std::streampos(size));
214 pop_stop_parse_pos();
218 std::streampos endPos = is.tellg();
219 uint16_t rcvdSize =
static_cast<uint16_t
>(endPos - startPos);
225 uint16_t seekOffset = size - rcvdSize;
226 is.seekg(seekOffset, std::ios_base::cur);
239 std::istream&
read (std::istream& is, std::string& s)
241 if (check_stop_parse(is))
247 read(is, size,
false);
248 if (check_stream(is) && check_slength(is, size))
251 parseStatus(
typeid(s), s.size());
252 read_internal(is,
const_cast<char*
>(s.c_str()), size,
true);
262 std::istream&
read (std::istream& is, std::wstring& s)
264 if (check_stop_parse(is))
270 read(is, size,
false);
271 if (check_stream(is) && check_slength(is, size))
274 parseStatus(
typeid(s), s.size());
275 for (uint16_t ii = 0; ii < size; ii++)
278 int offset =
sizeof(wchar_t) - WCHAR_SIZE;
279 read_internal(is,
reinterpret_cast<char*
>(&c) + offset, WCHAR_SIZE);
291 std::istream&
read (std::istream& is,
char* str)
293 if (check_stop_parse(is))
299 read(is, size,
false);
300 if (check_stream(is) && check_slength(is, size))
302 if (check_pointer(is, str))
304 parseStatus(
typeid(str), size);
305 read_internal(is, str, size,
true);
320 std::istream&
read (std::istream& is, std::vector<bool>& container)
322 if (check_stop_parse(is))
329 read(is, size,
false);
330 if (check_stream(is) && check_container_size(is, size))
332 parseStatus(
typeid(container), size);
333 for (uint16_t i = 0; i < size; ++i)
337 container.push_back(t);
349 std::ostream&
write (std::ostream& os,
I* t_)
351 if (check_pointer(os, t_))
353 uint16_t elementSize = 0;
356 std::streampos elementSizePos = os.tellp();
357 write(os, elementSize,
false);
360 t_->
write(*
this, os);
365 std::streampos currentPos = os.tellp();
366 os.seekp(elementSizePos);
367 elementSize =
static_cast<uint16_t
>(currentPos - elementSizePos);
368 write(os, elementSize,
false);
369 os.seekp(currentPos);
380 std::ostream&
write(std::ostream& os,
const std::string& s)
382 uint16_t size =
static_cast<uint16_t
>(s.size());
384 write(os, size,
false);
385 if (check_stream(os) && check_slength(os, size))
387 write_internal(os, s.c_str(), size,
true);
396 std::ostream&
write(std::ostream& os, std::string& s)
398 return write(os,
static_cast<const std::string&
>(s));
405 std::ostream&
write (std::ostream& os,
const std::wstring& s)
407 uint16_t size =
static_cast<uint16_t
>(s.size());
409 write(os, size,
false);
410 if (check_stream(os) && check_slength(os, size))
412 for (uint16_t ii = 0; ii < size; ii++)
415 int offset =
sizeof(wchar_t) - WCHAR_SIZE;
416 write_internal(os,
reinterpret_cast<char*
>(&c) + offset, WCHAR_SIZE);
426 std::ostream&
write (std::ostream& os, std::wstring& s)
428 return write(os,
static_cast<const std::wstring&
>(s));
435 std::ostream&
write(std::ostream& os,
char* str)
437 return write(os,
static_cast<const char*
>(str));
444 std::ostream&
write (std::ostream& os,
const char* str)
446 if (check_pointer(os, str))
448 uint16_t size =
static_cast<uint16_t
>(strlen(str)) + 1;
450 write(os, size,
false);
451 if (check_stream(os) && check_slength(os, size))
453 write_internal (os, str, size,
true);
467 std::ostream&
write (std::ostream& os, std::vector<bool>& container)
469 uint16_t size =
static_cast<uint16_t
>(container.size());
471 write(os, size,
false);
472 if (check_stream(os) && check_container_size(os, size))
474 for (
const bool& c : container)
487 std::istream&
read(std::istream& is, T &t_,
bool readPrependedType =
true)
491 static_assert(!(std::is_pointer<T>::value &&
492 (std::is_arithmetic<typename std::remove_pointer<T>::type>::value ||
493 std::is_class<typename std::remove_pointer<T>::type>::value)),
494 "T cannot be a pointer to a built-in or custom data type");
496 if (check_stop_parse(is))
500 if (std::is_class<T>::value ==
false)
503 if (std::is_pointer<T>::value ==
false)
505 if (readPrependedType)
513 if (readPrependedType)
514 parseStatus(
typeid(t_));
515 read_internal(is, (
char*)&t_,
sizeof (t_));
522 is.setstate(std::ios::failbit);
529 parseStatus(
typeid(t_));
540 std::ostream&
write(std::ostream& os, T &t_,
bool prependType =
true)
544 static_assert(!(std::is_pointer<T>::value &&
545 (std::is_arithmetic<typename std::remove_pointer<T>::type>::value ||
546 std::is_class<typename std::remove_pointer<T>::type>::value)),
547 "T cannot be a pointer to a built-in or custom data type");
550 if (std::is_class<T>::value ==
false)
553 if (std::is_pointer<T>::value ==
false)
559 return write_internal(os, (
const char*)&t_,
sizeof(t_));
565 os.setstate(std::ios::failbit);
582 std::ostream&
write(std::ostream& os, std::vector<T>& container)
586 uint16_t size =
static_cast<uint16_t
>(container.size());
588 write(os, size,
false);
589 if (check_stream(os) && check_container_size(os, size))
591 for (
const auto& item : container)
593 write(os, item,
false);
605 std::istream&
read(std::istream& is, std::vector<T>& container)
609 if (check_stop_parse(is))
616 read(is, size,
false);
617 if (check_stream(is) && check_container_size(is, size))
619 parseStatus(
typeid(container), size);
620 for (uint16_t i = 0; i < size; ++i)
624 container.push_back(t);
637 std::ostream&
write(std::ostream& os, std::vector<T*>& container)
639 static_assert(std::is_base_of<serialize::I, T>::value,
"Type T must be derived from serialize::I");
641 uint16_t size =
static_cast<uint16_t
>(container.size());
643 write(os, size,
false);
645 if (check_stream(os) && check_container_size(os, size))
647 for (
auto* ptr : container)
652 write(os, notNULL,
false);
654 auto* i =
static_cast<I*
>(ptr);
659 bool notNULL =
false;
660 write(os, notNULL,
false);
674 std::istream&
read(std::istream& is, std::vector<T*>& container)
676 static_assert(std::is_base_of<serialize::I, T>::value,
"Type T must be derived from serialize::I");
678 if (check_stop_parse(is))
685 read(is, size,
false);
686 if (check_stream(is) && check_container_size(is, size))
688 parseStatus(
typeid(container), size);
689 for (uint16_t i = 0; i < size; ++i)
691 bool notNULL =
false;
692 read(is, notNULL,
false);
697 auto *i =
static_cast<I*
>(object);
699 container.push_back(
object);
703 container.push_back(
nullptr);
716 template <
class K,
class V,
class P>
717 std::ostream&
write(std::ostream& os, std::map<K, V, P>& container)
721 uint16_t size =
static_cast<uint16_t
>(container.size());
723 write(os, size,
false);
724 if (check_stream(os) && check_container_size(os, size))
726 for (
const auto& entry : container)
728 write(os, entry.first,
false);
729 write(os, entry.second,
false);
740 template <
class K,
class V,
class P>
741 std::istream&
read(std::istream& is, std::map<K, V, P>& container)
745 if (check_stop_parse(is))
752 read(is, size,
false);
753 if (check_stream(is) && check_container_size(is, size))
755 parseStatus(
typeid(container), size);
756 for (uint16_t i = 0; i < size; ++i)
760 read(is, key,
false);
762 read(is, value,
false);
763 container[key] = value;
775 template <
class K,
class V,
class P>
776 std::ostream&
write(std::ostream& os, std::map<K, V*, P>& container)
778 static_assert(std::is_base_of<serialize::I, V>::value,
"Type V must be derived from serialize::I");
780 uint16_t size =
static_cast<uint16_t
>(container.size());
782 write(os, size,
false);
784 if (check_stream(os) && check_container_size(os, size))
786 for (
auto& entry : container)
788 write(os, entry.first,
false);
790 if (entry.second !=
nullptr)
793 write(os, notNULL,
false);
795 auto* i =
static_cast<I*
>(entry.second);
800 bool notNULL =
false;
801 write(os, notNULL,
false);
813 template <
class K,
class V,
class P>
814 std::istream&
read(std::istream& is, std::map<K, V*, P>& container)
816 static_assert(std::is_base_of<serialize::I, V>::value,
"Type V must be derived from serialize::I");
818 if (check_stop_parse(is))
825 read(is, size,
false);
826 if (check_stream(is) && check_container_size(is, size))
828 parseStatus(
typeid(container), size);
829 for (uint16_t i = 0; i < size; ++i)
832 read(is, key,
false);
834 read(is, notNULL,
false);
838 auto *i =
static_cast<I*
>(object);
840 container[key] = (V*)
object;
844 container[key] =
nullptr;
857 template <
class T,
class P>
858 std::ostream&
write(std::ostream& os, std::set<T, P>& container)
862 uint16_t size =
static_cast<uint16_t
>(container.size());
864 write(os, size,
false);
866 if (check_stream(os) && check_container_size(os, size))
868 for (
const auto& item : container)
870 write(os, item,
false);
881 template <
class T,
class P>
882 std::istream&
read(std::istream& is, std::set<T, P>& container)
886 if (check_stop_parse(is))
893 read(is, size,
false);
894 if (check_stream(is) && check_container_size(is, size))
896 parseStatus(
typeid(container), size);
897 for (uint16_t i = 0; i < size; ++i)
913 template <
class T,
class P>
914 std::ostream&
write(std::ostream& os, std::set<T*, P>& container)
916 static_assert(std::is_base_of<serialize::I, T>::value,
"Type T must be derived from serialize::I");
918 uint16_t size =
static_cast<uint16_t
>(container.size());
920 write(os, size,
false);
921 if (check_stream(os) && check_container_size(os, size))
923 for (
auto ptr : container)
928 write(os, notNULL,
false);
930 auto* i =
static_cast<I*
>(ptr);
935 bool notNULL =
false;
936 write(os, notNULL,
false);
948 template <
class T,
class P>
949 std::istream&
read(std::istream& is, std::set<T*, P>& container)
951 static_assert(std::is_base_of<serialize::I, T>::value,
"Type T must be derived from serialize::I");
953 if (check_stop_parse(is))
960 read(is, size,
false);
961 if (check_stream(is) && check_container_size(is, size))
963 parseStatus(
typeid(container), size);
964 for (uint16_t i = 0; i < size; ++i)
966 bool notNULL =
false;
967 read(is, notNULL,
false);
971 auto *i =
static_cast<I*
>(object);
973 container.insert(
object);
977 container.insert(
nullptr);
991 std::ostream&
write(std::ostream& os, std::list<T>& container)
995 uint16_t size =
static_cast<uint16_t
>(container.size());
997 write(os, size,
false);
999 if (check_stream(os) && check_container_size(os, size))
1001 for (
const auto& item : container)
1003 write(os, item,
false);
1015 std::istream&
read(std::istream& is, std::list<T>& container)
1019 if (check_stop_parse(is))
1026 read(is, size,
false);
1027 if (check_stream(is) && check_container_size(is, size))
1029 parseStatus(
typeid(container), size);
1030 for (uint16_t i = 0; i < size; ++i)
1034 container.push_back(t);
1047 std::ostream&
write(std::ostream& os, std::list<T*>& container)
1049 static_assert(std::is_base_of<serialize::I, T>::value,
"Type T must be derived from serialize::I");
1051 uint16_t size =
static_cast<uint16_t
>(container.size());
1053 write(os, size,
false);
1055 if (check_stream(os) && check_container_size(os, size))
1057 for (
auto* ptr : container)
1061 bool notNULL =
true;
1062 write(os, notNULL,
false);
1064 auto* i =
static_cast<I*
>(ptr);
1069 bool notNULL =
false;
1070 write(os, notNULL,
false);
1083 std::istream&
read(std::istream& is, std::list<T*>& container)
1085 static_assert(std::is_base_of<serialize::I, T>::value,
"Type T must be derived from serialize::I");
1087 if (check_stop_parse(is))
1094 read(is, size,
false);
1095 if (check_stream(is) && check_container_size(is, size))
1097 parseStatus(
typeid(container), size);
1098 for (uint16_t i = 0; i < size; ++i)
1100 bool notNULL =
false;
1101 read(is, notNULL,
false);
1105 auto *i =
static_cast<I*
>(object);
1107 container.push_back(
object);
1111 container.push_back(
nullptr);
1122 error_handler = error_handler_;
1131 parse_handler = parse_handler_;
1142 std::istream& read_internal(std::istream& is,
char* p, uint32_t size,
bool no_swap =
false)
1144 if (check_stop_parse(is))
1149 if (!check_pointer(is, p))
1153 if (
LE() && !no_swap)
1156 for (
int i = size - 1; i >= 0; --i)
1177 std::ostream& write_internal(std::ostream& os,
const char* p, uint32_t size,
bool no_swap =
false)
1179 if (!check_pointer(os, p))
1183 if (
LE() && !no_swap)
1186 for (
int i = size - 1; i >= 0; --i)
1200 static const uint16_t MAX_STRING_SIZE = 256;
1201 static const uint16_t MAX_CONTAINER_SIZE = 200;
1204 static const size_t WCHAR_SIZE = 2;
1207 std::list<std::streampos> stopParsePosStack;
1211 void raiseError(
ParsingError error,
int line,
const char* file)
1215 error_handler(error, line, file);
1219 void parseStatus(
const std::type_info& typeId,
size_t size = 0)
1222 parse_handler(typeId, size);
1225 void write_type(std::ostream& os,
Type type_)
1227 uint8_t type =
static_cast<uint8_t
>(type_);
1228 write_internal(os, (
const char*) &type,
sizeof(type));
1231 bool read_type(std::istream& is,
Type type_)
1233 Type type =
static_cast<Type>(is.peek());
1236 uint8_t typeByte = 0;
1237 read_internal(is, (
char*) &typeByte,
sizeof(typeByte));
1243 is.setstate(std::ios::failbit);
1248 bool check_stream(std::ios& stream)
1253 stream.setstate(std::ios::failbit);
1255 return stream.good();
1258 bool check_slength(std::ios& stream,
int stringSize)
1260 bool sizeOk = stringSize <= MAX_STRING_SIZE;
1264 stream.setstate(std::ios::failbit);
1266 if (stringSize == 0)
1271 bool check_container_size(std::ios& stream,
int containerSize)
1273 bool sizeOk = containerSize <= MAX_CONTAINER_SIZE;
1277 stream.setstate(std::ios::failbit);
1282 bool check_pointer(std::ios& stream,
const void* ptr)
1287 stream.setstate(std::ios::failbit);
1292 void push_stop_parse_pos(std::streampos stopParsePos)
1294 stopParsePosStack.push_front(stopParsePos);
1297 std::streampos pop_stop_parse_pos()
1299 std::streampos stopParsePos = stopParsePosStack.front();
1300 stopParsePosStack.pop_front();
1301 return stopParsePos;
1304 bool check_stop_parse(std::istream& is)
1311 if (stopParsePosStack.size() > 0)
1313 std::streampos stopParsePos = stopParsePosStack.front();
1314 if (is.tellg() >= stopParsePos)
Abstract interface that all serialized user defined classes inherit.
Definition msg_serialize.h:109
virtual std::ostream & write(serialize &ms, std::ostream &os)=0
virtual std::istream & read(serialize &ms, std::istream &is)=0
The serialize class binary serializes and deserializes C++ objects.
Definition msg_serialize.h:105
std::ostream & write(std::ostream &os, char *str)
Definition msg_serialize.h:435
void writeEndian(std::ostream &os)
Definition msg_serialize.h:181
std::ostream & write(std::ostream &os, std::set< T, P > &container)
Definition msg_serialize.h:858
bool LE()
Definition msg_serialize.h:160
std::istream & read(std::istream &is, std::vector< bool > &container)
Definition msg_serialize.h:320
std::istream & read(std::istream &is, std::wstring &s)
Definition msg_serialize.h:262
std::istream & read(std::istream &is, std::map< K, V *, P > &container)
Definition msg_serialize.h:814
std::istream & read(std::istream &is, char *str)
Definition msg_serialize.h:291
std::ostream & write(std::ostream &os, const std::wstring &s)
Definition msg_serialize.h:405
std::ostream & write(std::ostream &os, std::map< K, V *, P > &container)
Definition msg_serialize.h:776
void setParseHandler(ParseHandler parse_handler_)
Definition msg_serialize.h:1129
std::ostream & write(std::ostream &os, const std::string &s)
Definition msg_serialize.h:380
void clearLastError()
Definition msg_serialize.h:1126
std::ostream & write(std::ostream &os, std::wstring &s)
Definition msg_serialize.h:426
std::ostream & write(std::ostream &os, std::vector< T * > &container)
Definition msg_serialize.h:637
std::istream & read(std::istream &is, std::set< T, P > &container)
Definition msg_serialize.h:882
std::ostream & write(std::ostream &os, T &t_, bool prependType=true)
Definition msg_serialize.h:540
std::istream & read(std::istream &is, std::list< T * > &container)
Definition msg_serialize.h:1083
std::ostream & write(std::ostream &os, std::vector< T > &container)
Definition msg_serialize.h:582
std::ostream & write(std::ostream &os, std::list< T > &container)
Definition msg_serialize.h:991
std::ostream & write(std::ostream &os, std::set< T *, P > &container)
Definition msg_serialize.h:914
Type
Definition msg_serialize.h:131
std::ostream & write(std::ostream &os, std::map< K, V, P > &container)
Definition msg_serialize.h:717
void setErrorHandler(ErrorHandler error_handler_)
Definition msg_serialize.h:1120
std::ostream & write(std::ostream &os, std::vector< bool > &container)
Definition msg_serialize.h:467
std::istream & read(std::istream &is, T &t_, bool readPrependedType=true)
Definition msg_serialize.h:487
std::ostream & write(std::ostream &os, std::string &s)
Definition msg_serialize.h:396
std::istream & read(std::istream &is, std::set< T *, P > &container)
Definition msg_serialize.h:949
std::istream & read(std::istream &is, std::vector< T > &container)
Definition msg_serialize.h:605
std::ostream & write(std::ostream &os, std::list< T * > &container)
Definition msg_serialize.h:1047
void(*) ParseHandler(const std::type_info &typeId, size_t size)
Definition msg_serialize.h:1128
ParsingError getLastError() const
Definition msg_serialize.h:1125
std::istream & read(std::istream &is, std::string &s)
Definition msg_serialize.h:239
std::istream & read(std::istream &is, I *t_)
Definition msg_serialize.h:195
std::istream & readEndian(std::istream &is, bool &littleEndian)
Definition msg_serialize.h:170
std::ostream & write(std::ostream &os, I *t_)
Definition msg_serialize.h:349
void(*) ErrorHandler(ParsingError error, int line, const char *file)
Definition msg_serialize.h:1119
ParsingError
Definition msg_serialize.h:145
std::istream & read(std::istream &is, std::vector< T * > &container)
Definition msg_serialize.h:674
std::istream & read(std::istream &is, std::map< K, V, P > &container)
Definition msg_serialize.h:741
std::istream & read(std::istream &is, std::list< T > &container)
Definition msg_serialize.h:1015
std::ostream & write(std::ostream &os, const char *str)
Definition msg_serialize.h:444
Definition msg_serialize.h:21
Definition msg_serialize.h:23
Definition msg_serialize.h:29