15#ifndef _FASTCDR_FASTCDR_H_
16#define _FASTCDR_FASTCDR_H_
24#if !__APPLE__ && !__FreeBSD__ && !__VXWORKS__
30#include "fastcdr_dll.h"
31#include "FastBuffer.h"
32#include "exceptions/NotEnoughMemoryException.h"
33#include "exceptions/BadParamException.h"
70 const state&) =
delete;
109 return current_position_ - cdr_buffer_.begin();
132 const uint8_t octet_t)
168 const uint16_t ushort_t)
180 const int16_t short_t)
192 const uint32_t ulong_t)
204 const int32_t long_t)
228 const uint64_t ulonglong_t)
240 const int64_t longlong_t)
264 const double double_t)
276 const long double ldouble_t)
300 const char* string_t)
312 const wchar_t* string_t)
324 const std::string& string_t)
336 const std::wstring& string_t)
347 template<
class _T,
size_t _Size>
349 const std::array<_T, _Size>& array_t)
362 const std::vector<_T>& vector_t)
377 type_t.serialize(*
this);
484 uint64_t& ulonglong_t)
532 long double& ldouble_t)
572 std::string& string_t)
584 std::wstring& string_t)
595 template<
class _T,
size_t _Size>
597 std::array<_T, _Size>& array_t)
610 std::vector<_T>& vector_t)
625 type_t.deserialize(*
this);
637 const uint8_t octet_t)
639 return serialize(
static_cast<char>(octet_t));
652 if (((last_position_ - current_position_) >=
sizeof(char_t)) || resize(
sizeof(char_t)))
654 current_position_++ << char_t;
672 return serialize(
static_cast<char>(int8));
683 const uint16_t ushort_t)
685 return serialize(
static_cast<int16_t
>(ushort_t));
696 const int16_t short_t)
698 if (((last_position_ - current_position_) >=
sizeof(short_t)) || resize(
sizeof(short_t)))
700 current_position_ << short_t;
701 current_position_ +=
sizeof(short_t);
718 const uint32_t ulong_t)
720 return serialize(
static_cast<int32_t
>(ulong_t));
731 const int32_t long_t)
733 if (((last_position_ - current_position_) >=
sizeof(long_t)) || resize(
sizeof(long_t)))
735 current_position_ << long_t;
736 current_position_ +=
sizeof(long_t);
755 return serialize(
static_cast<uint32_t
>(wchar));
766 const uint64_t ulonglong_t)
768 return serialize(
static_cast<int64_t
>(ulonglong_t));
779 const int64_t longlong_t)
781 if (((last_position_ - current_position_) >=
sizeof(longlong_t)) || resize(
sizeof(longlong_t)))
783 current_position_ << longlong_t;
784 current_position_ +=
sizeof(longlong_t);
803 if (((last_position_ - current_position_) >=
sizeof(float_t)) || resize(
sizeof(float_t)))
805 current_position_ << float_t;
806 current_position_ +=
sizeof(float_t);
823 const double double_t)
825 if (((last_position_ - current_position_) >=
sizeof(double_t)) || resize(
sizeof(double_t)))
827 current_position_ << double_t;
828 current_position_ +=
sizeof(double_t);
845 const long double ldouble_t)
847 if (((last_position_ - current_position_) >=
sizeof(ldouble_t)) || resize(
sizeof(ldouble_t)))
849 current_position_ << ldouble_t;
851 current_position_ +=
sizeof(ldouble_t);
852 current_position_ << static_cast<long double>(0);
854 current_position_ +=
sizeof(ldouble_t);
879 const char* string_t);
888 const wchar_t* string_t);
899 const std::string& string_t)
902 const char* c_str = string_t.c_str();
903 const auto str_len = strlen(c_str);
904 if (string_t.size() > str_len)
920 const std::wstring& string_t)
931 template<
class _T,
size_t _Size>
933 const std::array<_T, _Size>& array_t)
944 template<
class _T =
bool>
946 const std::vector<bool>& vector_t)
948 return serialize_bool_sequence(vector_t);
959 const std::vector<_T>& vector_t)
961 state state_before_error(*
this);
963 *this << static_cast<int32_t>(vector_t.size());
987 const std::vector<bool>& vector_t)
989 return serialize_bool_sequence(vector_t);
1017 const uint8_t* octet_t,
1018 size_t num_elements)
1020 return serialize_array(
reinterpret_cast<const char*
>(octet_t), num_elements);
1032 size_t num_elements);
1044 size_t num_elements)
1046 return serialize_array(
reinterpret_cast<const char*
>(int8), num_elements);
1058 const uint16_t* ushort_t,
1059 size_t num_elements)
1061 return serialize_array(
reinterpret_cast<const int16_t*
>(ushort_t), num_elements);
1072 const int16_t* short_t,
1073 size_t num_elements);
1084 const uint32_t* ulong_t,
1085 size_t num_elements)
1087 return serialize_array(
reinterpret_cast<const int32_t*
>(ulong_t), num_elements);
1098 const int32_t* long_t,
1099 size_t num_elements);
1109 const wchar_t* wchar,
1110 size_t num_elements);
1121 const uint64_t* ulonglong_t,
1122 size_t num_elements)
1124 return serialize_array(
reinterpret_cast<const int64_t*
>(ulonglong_t), num_elements);
1135 const int64_t* longlong_t,
1136 size_t num_elements);
1146 const float* float_t,
1147 size_t num_elements);
1157 const double* double_t,
1158 size_t num_elements);
1168 const long double* ldouble_t,
1169 size_t num_elements);
1180 size_t num_elements);
1191 const std::string* string_t,
1192 size_t num_elements)
1194 for (
size_t count = 0; count < num_elements; ++count)
1210 const std::wstring* string_t,
1211 size_t num_elements)
1213 for (
size_t count = 0; count < num_elements; ++count)
1229 const std::vector<_T>* vector_t,
1230 size_t num_elements)
1232 for (
size_t count = 0; count < num_elements; ++count)
1249 size_t num_elements)
1251 for (
size_t count = 0; count < num_elements; ++count)
1253 type_t[count].serialize(*
this);
1267 const _T* sequence_t,
1268 size_t num_elements)
1270 state state_before_error(*
this);
1272 serialize(
static_cast<int32_t
>(num_elements));
1297 return deserialize(
reinterpret_cast<char&
>(octet_t));
1310 if ((last_position_ - current_position_) >=
sizeof(char_t))
1312 current_position_++ >> char_t;
1330 return deserialize(
reinterpret_cast<char&
>(int8));
1343 return deserialize(
reinterpret_cast<int16_t&
>(ushort_t));
1356 if ((last_position_ - current_position_) >=
sizeof(short_t))
1358 current_position_ >> short_t;
1359 current_position_ +=
sizeof(short_t);
1378 return deserialize(
reinterpret_cast<int32_t&
>(ulong_t));
1391 if ((last_position_ - current_position_) >=
sizeof(long_t))
1393 current_position_ >> long_t;
1394 current_position_ +=
sizeof(long_t);
1415 wchar =
static_cast<wchar_t>(ret);
1427 uint64_t& ulonglong_t)
1429 return deserialize(
reinterpret_cast<int64_t&
>(ulonglong_t));
1440 int64_t& longlong_t)
1442 if ((last_position_ - current_position_) >=
sizeof(longlong_t))
1444 current_position_ >> longlong_t;
1445 current_position_ +=
sizeof(longlong_t);
1464 if ((last_position_ - current_position_) >=
sizeof(float_t))
1466 current_position_ >> float_t;
1467 current_position_ +=
sizeof(float_t);
1486 if ((last_position_ - current_position_) >=
sizeof(double_t))
1488 current_position_ >> double_t;
1489 current_position_ +=
sizeof(double_t);
1506 long double& ldouble_t)
1508 if ((last_position_ - current_position_) >=
sizeof(ldouble_t))
1510 current_position_ >> ldouble_t;
1511 current_position_ +=
sizeof(ldouble_t);
1513 current_position_ +=
sizeof(ldouble_t);
1555 wchar_t*& string_t);
1565 std::string& string_t)
1567 uint32_t length = 0;
1568 const char* str = read_string(length);
1569 string_t.assign(str, length);
1581 std::wstring& string_t)
1583 uint32_t length = 0;
1584 string_t = read_wstring(length);
1594 template<
class _T,
size_t _Size>
1596 std::array<_T, _Size>& array_t)
1607 template<
class _T =
bool>
1609 std::vector<bool>& vector_t)
1611 return deserialize_bool_sequence(vector_t);
1622 std::vector<_T>& vector_t)
1624 uint32_t sequence_length = 0;
1625 state state_before_error(*
this);
1627 *
this >> sequence_length;
1631 vector_t.resize(sequence_length);
1652 std::vector<bool>& vector_t)
1654 return deserialize_bool_sequence(vector_t);
1683 size_t num_elements)
1697 size_t num_elements);
1709 size_t num_elements)
1724 size_t num_elements)
1738 size_t num_elements);
1750 size_t num_elements)
1764 size_t num_elements);
1775 size_t num_elements);
1786 uint64_t* ulonglong_t,
1787 size_t num_elements)
1789 return deserialize_array(
reinterpret_cast<int64_t*
>(ulonglong_t), num_elements);
1800 int64_t* longlong_t,
1801 size_t num_elements);
1812 size_t num_elements);
1823 size_t num_elements);
1833 long double* ldouble_t,
1834 size_t num_elements);
1845 size_t num_elements);
1856 std::string* string_t,
1857 size_t num_elements)
1859 for (
size_t count = 0; count < num_elements; ++count)
1875 std::wstring* string_t,
1876 size_t num_elements)
1878 for (
size_t count = 0; count < num_elements; ++count)
1894 std::vector<_T>* vector_t,
1895 size_t num_elements)
1897 for (
size_t count = 0; count < num_elements; ++count)
1914 size_t num_elements)
1916 for (
size_t count = 0; count < num_elements; ++count)
1918 type_t[count].deserialize(*
this);
1932 template<
class _T = std::
string>
1934 std::string*& sequence_t,
1935 size_t& num_elements)
1937 return deserialize_string_sequence(sequence_t, num_elements);
1949 template<
class _T = std::w
string>
1951 std::wstring*& sequence_t,
1952 size_t& num_elements)
1954 return deserialize_wstring_sequence(sequence_t, num_elements);
1969 size_t& num_elements)
1971 uint32_t sequence_length = 0;
1972 state state_before_error(*
this);
1978 sequence_t =
reinterpret_cast<_T*
>(calloc(sequence_length,
sizeof(_T)));
1989 num_elements = sequence_length;
2004 FastCdr& deserialize_sequence<std::string>(
2005 std::string*& sequence_t,
2006 size_t& num_elements)
2008 return deserialize_string_sequence(sequence_t, num_elements);
2021 FastCdr& deserialize_sequence<std::wstring>(
2022 std::wstring*& sequence_t,
2023 size_t& num_elements)
2025 return deserialize_wstring_sequence(sequence_t, num_elements);
2033 const FastCdr&) =
delete;
2035 FastCdr& operator =(
2036 const FastCdr&) =
delete;
2038 FastCdr& serialize_bool_sequence(
2039 const std::vector<bool>& vector_t);
2041 FastCdr& deserialize_bool_sequence(
2042 std::vector<bool>& vector_t);
2044 FastCdr& deserialize_string_sequence(
2045 std::string*& sequence_t,
2046 size_t& num_elements);
2048 FastCdr& deserialize_wstring_sequence(
2049 std::wstring*& sequence_t,
2050 size_t& num_elements);
2059 template<
class _T,
size_t _Size>
2060 FastCdr& serialize_array(
2061 const std::array<_T, _Size>* array_t,
2062 size_t num_elements)
2064 if (num_elements == 0 || array_t ==
nullptr)
2068 return serialize_array(array_t->data(), num_elements * array_t->size());
2078 template<
class _T,
size_t _Size>
2079 FastCdr& deserialize_array(
2080 std::array<_T, _Size>* array_t,
2081 size_t num_elements)
2083 if (num_elements == 0 || array_t ==
nullptr)
2087 return deserialize_array(array_t->data(), num_elements * array_t->size());
2091 size_t min_size_inc);
2093 const char* read_string(
2096 std::wstring read_wstring(
2100 FastBuffer& cdr_buffer_;
2103 FastBuffer::iterator current_position_;
2106 FastBuffer::iterator last_position_;
This class represents a stream of bytes that contains (or will contain) serialized data.
Definition FastBuffer.h:244
_FastBuffer_iterator iterator
Definition FastBuffer.h:247
This class stores the current state of a CDR serialization.
Definition FastCdr.h:50
state(const FastCdr &fastcdr)
Default constructor.
friend class FastCdr
Definition FastCdr.h:51
state(const state &)
Copy constructor.
This class offers an interface to serialize/deserialize some basic types using a modified CDR protoco...
Definition FastCdr.h:43
FastCdr & deserialize_array(float *float_t, size_t num_elements)
This function deserializes an array of floats.
FastCdr & serialize_array(const int8_t *int8, size_t num_elements)
This function serializes an array of int8_t.
Definition FastCdr.h:1042
FastCdr & serialize(const wchar_t *string_t)
This function serializes a wstring.
FastCdr & deserialize_array(std::vector< _T > *vector_t, size_t num_elements)
This function template deserializes an array of sequences.
Definition FastCdr.h:1893
FastCdr & deserialize(char *&string_t)
This function deserializes a string.
FastCdr & deserialize(int8_t &int8)
This function deserializes an int8_t.
Definition FastCdr.h:1327
FastCdr & serialize(const wchar_t wchar)
This function serializes a wide-char.
Definition FastCdr.h:752
FastCdr & deserialize_array(uint8_t *octet_t, size_t num_elements)
This function deserializes an array of octets.
Definition FastCdr.h:1681
FastCdr & serialize(const std::vector< _T > &vector_t)
This function template serializes a sequence.
Definition FastCdr.h:958
FastCdr & serialize_array(const uint32_t *ulong_t, size_t num_elements)
This function serializes an array of unsigned longs.
Definition FastCdr.h:1083
bool jump(size_t num_bytes)
This function skips a number of bytes in the CDR stream buffer.
FastCdr & deserialize(wchar_t &wchar)
This function deserializes a wide-char.
Definition FastCdr.h:1410
FastCdr & deserialize_array(std::wstring *string_t, size_t num_elements)
This function deserializes an array of wide-strings.
Definition FastCdr.h:1874
FastCdr & serialize_array(const int32_t *long_t, size_t num_elements)
This function serializes an array of longs.
FastCdr & serialize_array(const _T *type_t, size_t num_elements)
This function template serializes an array of non-basic type objects.
Definition FastCdr.h:1247
FastCdr & deserialize_sequence(_T *&sequence_t, size_t &num_elements)
This function template deserializes a raw sequence.
Definition FastCdr.h:1967
FastCdr & serialize(const uint8_t octet_t)
This function serializes an octet.
Definition FastCdr.h:636
FastCdr & deserialize_array(int16_t *short_t, size_t num_elements)
This function deserializes an array of shorts.
FastCdr & deserialize_array(_T *type_t, size_t num_elements)
This function template deserializes an array of non-basic type objects.
Definition FastCdr.h:1912
FastCdr & deserialize(double &double_t)
This function deserializes a double.
Definition FastCdr.h:1483
FastCdr & serialize(const int16_t short_t)
This function serializes a short.
Definition FastCdr.h:695
FastCdr & deserialize(float &float_t)
This function deserializes a float.
Definition FastCdr.h:1461
FastCdr & serialize_array(const int16_t *short_t, size_t num_elements)
This function serializes an array of shorts.
FastCdr & serialize_array(const wchar_t *wchar, size_t num_elements)
This function serializes an array of wide-chars.
FastCdr & deserialize(bool &bool_t)
This function deserializes a boolean.
FastCdr & serialize_array(const uint16_t *ushort_t, size_t num_elements)
This function serializes an array of unsigned shorts.
Definition FastCdr.h:1057
FastCdr & deserialize(uint64_t &ulonglong_t)
This function deserializes an unsigned long long.
Definition FastCdr.h:1426
FastCdr & deserialize(std::array< _T, _Size > &array_t)
This function template deserializes an array.
Definition FastCdr.h:1595
FastCdr & serialize_array(const std::string *string_t, size_t num_elements)
This function serializes an array of strings.
Definition FastCdr.h:1190
FastCdr & deserialize(int64_t &longlong_t)
This function deserializes a long long.
Definition FastCdr.h:1439
FastCdr & deserialize(_T &type_t)
This function template deserializes a non-basic type object.
Definition FastCdr.h:1666
FastCdr & deserialize(int16_t &short_t)
This function deserializes a short.
Definition FastCdr.h:1353
FastCdr & serialize_array(const uint8_t *octet_t, size_t num_elements)
This function serializes an array of octets.
Definition FastCdr.h:1016
FastCdr & serialize(const float float_t)
This function serializes a float.
Definition FastCdr.h:800
FastCdr & deserialize_sequence(std::string *&sequence_t, size_t &num_elements)
This function template deserializes a string sequence.
Definition FastCdr.h:1933
FastCdr & serialize(const int8_t int8)
This function serializes an int8_t.
Definition FastCdr.h:669
FastCdr & deserialize(std::wstring &string_t)
This function deserializes a std::wstring.
Definition FastCdr.h:1580
FastCdr & serialize_array(const char *char_t, size_t num_elements)
This function serializes an array of characters.
FastCdr & deserialize(char &char_t)
This function deserializes a character.
Definition FastCdr.h:1307
FastCdr & serialize(const double double_t)
This function serializes a double.
Definition FastCdr.h:822
FastCdr & serialize_array(const std::wstring *string_t, size_t num_elements)
This function serializes an array of wstrings.
Definition FastCdr.h:1209
FastCdr & deserialize_sequence(std::wstring *&sequence_t, size_t &num_elements)
This function template deserializes a wide-string sequence.
Definition FastCdr.h:1950
FastCdr & serialize(const bool bool_t)
This function serializes a boolean.
FastCdr & deserialize(std::vector< _T > &vector_t)
This function template deserializes a sequence.
Definition FastCdr.h:1621
FastCdr & serialize_array(const bool *bool_t, size_t num_elements)
This function serializes an array of booleans.
FastCdr & deserialize(long double &ldouble_t)
This function deserializes a long double.
Definition FastCdr.h:1505
FastCdr & serialize_array(const uint64_t *ulonglong_t, size_t num_elements)
This function serializes an array of unsigned long longs.
Definition FastCdr.h:1120
FastCdr & deserialize_array(uint32_t *ulong_t, size_t num_elements)
This function deserializes an array of unsigned longs.
Definition FastCdr.h:1748
FastCdr & deserialize(wchar_t *&string_t)
This function deserializes a wide string.
FastCdr & deserialize_array(long double *ldouble_t, size_t num_elements)
This function deserializes an array of long doubles.
FastCdr & deserialize_array(int64_t *longlong_t, size_t num_elements)
This function deserializes an array of long longs.
FastCdr & serialize(const uint32_t ulong_t)
This function serializes an unsigned long.
Definition FastCdr.h:717
FastCdr(FastBuffer &cdr_buffer)
This constructor creates a eprosima::fastcdr::FastCdr object that can serialize/deserialize the assig...
FastCdr & serialize(const std::wstring &string_t)
This function serializes a std::wstring.
Definition FastCdr.h:919
FastCdr & serialize(const uint16_t ushort_t)
This function serializes an unsigned short.
Definition FastCdr.h:682
FastCdr & serialize(const std::array< _T, _Size > &array_t)
This function template serializes an array.
Definition FastCdr.h:932
FastCdr & serialize_sequence(const _T *sequence_t, size_t num_elements)
This function template serializes a raw sequence.
Definition FastCdr.h:1266
FastCdr & serialize(const uint64_t ulonglong_t)
This function serializes an unsigned long long.
Definition FastCdr.h:765
FastCdr & deserialize(int32_t &long_t)
This function deserializes a long.
Definition FastCdr.h:1388
FastCdr & deserialize_array(uint64_t *ulonglong_t, size_t num_elements)
This function deserializes an array of unsigned long longs.
Definition FastCdr.h:1785
FastCdr & serialize_array(const long double *ldouble_t, size_t num_elements)
This function serializes an array of long doubles.
void set_state(FastCdr::state &state)
This function sets a previous state of the CDR stream;.
FastCdr & serialize_array(const double *double_t, size_t num_elements)
This function serializes an array of doubles.
FastCdr & serialize(const char *string_t)
This function serializes a string.
FastCdr & deserialize(uint16_t &ushort_t)
This function deserializes an unsigned short.
Definition FastCdr.h:1340
FastCdr & deserialize_array(char *char_t, size_t num_elements)
This function deserializes an array of characters.
FastCdr & deserialize(uint32_t &ulong_t)
This function deserializes an unsigned long.
Definition FastCdr.h:1375
FastCdr & serialize(const int32_t long_t)
This function serializes a long.
Definition FastCdr.h:730
FastCdr & serialize(const std::vector< bool > &vector_t)
This function template serializes a sequence of booleans.
Definition FastCdr.h:945
FastCdr & deserialize_array(int8_t *int8, size_t num_elements)
This function deserializes an array of int8_t.
Definition FastCdr.h:1707
FastCdr & serialize_array(const int64_t *longlong_t, size_t num_elements)
This function serializes an array of long longs.
FastCdr & deserialize(std::vector< bool > &vector_t)
This function template deserializes a sequence of booleans.
Definition FastCdr.h:1608
size_t get_serialized_data_length() const
This function returns the length of the serialized data inside the stream.
Definition FastCdr.h:107
void reset()
This function resets the current position in the buffer to the begining.
FastCdr & serialize(const char char_t)
This function serializes a character.
Definition FastCdr.h:649
FastCdr & deserialize_array(uint16_t *ushort_t, size_t num_elements)
This function deserializes an array of unsigned shorts.
Definition FastCdr.h:1722
FastCdr::state get_state()
This function returns the current state of the CDR stream.
FastCdr & serialize_array(const std::vector< _T > *vector_t, size_t num_elements)
This function template serializes an array of sequences.
Definition FastCdr.h:1228
FastCdr & serialize_array(const float *float_t, size_t num_elements)
This function serializes an array of floats.
FastCdr & deserialize_array(bool *bool_t, size_t num_elements)
This function deserializes an array of booleans.
FastCdr & deserialize_array(std::string *string_t, size_t num_elements)
This function deserializes an array of strings.
Definition FastCdr.h:1855
FastCdr & deserialize_array(double *double_t, size_t num_elements)
This function deserializes an array of doubles.
FastCdr & deserialize(uint8_t &octet_t)
This function deserializes an octet.
Definition FastCdr.h:1294
FastCdr & deserialize_array(wchar_t *wchar, size_t num_elements)
This function deserializes an array of wide-chars.
FastCdr & serialize(const std::string &string_t)
This function serializes a std::string.
Definition FastCdr.h:898
char * get_current_position()
This function returns the current position in the CDR stream.
FastCdr & serialize(const long double ldouble_t)
This function serializes a long double.
Definition FastCdr.h:844
FastCdr & serialize(const int64_t longlong_t)
This function serializes a long long.
Definition FastCdr.h:778
FastCdr & serialize(const _T &type_t)
This function template serializes a non-basic type.
Definition FastCdr.h:1001
FastCdr & deserialize_array(int32_t *long_t, size_t num_elements)
This function deserializes an array of longs.
FastCdr & deserialize(std::string &string_t)
This function deserializes a std::string.
Definition FastCdr.h:1564
This class is thrown as an exception when an invalid parameter is being serialized.
Definition BadParamException.h:28
This abstract class is used to create exceptions.
Definition Exception.h:29
virtual void raise() const =0
This function throws the object as exception.
This class is thrown as an exception when the buffer's internal memory reachs its size limit.
Definition NotEnoughMemoryException.h:28
static const char *const NOT_ENOUGH_MEMORY_MESSAGE_DEFAULT
Default message used in the library.
Definition NotEnoughMemoryException.h:78
void deserialize(Cdr &, _T &)
void serialize(Cdr &, const _T &)