Generic templates for data packing/unpacking replaced with specific to avoid accidental use

This commit is contained in:
Simon Rozman 2016-07-20 09:14:47 +02:00
parent a0303f0a1f
commit 54fc2dd830

View File

@ -29,29 +29,106 @@
namespace eapserial namespace eapserial
{ {
/// ///
/// Packs a primitive data /// Packs a boolean
/// ///
/// \param[inout] cursor Memory cursor /// \param[inout] cursor Memory cursor
/// \param[in] val Variable with data to pack /// \param[in] val Variable with data to pack
/// ///
template <class T> inline void pack(_Inout_ unsigned char *&cursor, _In_ const T &val); inline void pack(_Inout_ unsigned char *&cursor, _In_ const bool &val);
/// ///
/// Returns packed size of a primitive data /// Returns packed size of a boolean
/// ///
/// \param[in] val Data to pack /// \param[in] val Data to pack
/// ///
/// \returns Size of data when packed (in bytes) /// \returns Size of data when packed (in bytes)
/// ///
template <class T> inline size_t get_pk_size(_In_ const T &val); inline size_t get_pk_size(_In_ const bool &val);
/// ///
/// Unpacks a primitive data /// Unpacks a boolean
/// ///
/// \param[inout] cursor Memory cursor /// \param[inout] cursor Memory cursor
/// \param[out] val Variable to receive unpacked value /// \param[out] val Variable to receive unpacked value
/// ///
template <class T> inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ T &val); inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ bool &val);
///
/// Packs a byte
///
/// \param[inout] cursor Memory cursor
/// \param[in] val Variable with data to pack
///
inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned char &val);
///
/// Returns packed size of a byte
///
/// \param[in] val Data to pack
///
/// \returns Size of data when packed (in bytes)
///
inline size_t get_pk_size(_In_ const unsigned char &val);
///
/// Unpacks a byte
///
/// \param[inout] cursor Memory cursor
/// \param[out] val Variable to receive unpacked value
///
inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned char &val);
///
/// Packs an unsigned int
///
/// \param[inout] cursor Memory cursor
/// \param[in] val Variable with data to pack
///
inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned int &val);
///
/// Returns packed size of an unsigned int
///
/// \param[in] val Data to pack
///
/// \returns Size of data when packed (in bytes)
///
inline size_t get_pk_size(_In_ const unsigned int &val);
///
/// Unpacks an unsigned int
///
/// \param[inout] cursor Memory cursor
/// \param[out] val Variable to receive unpacked value
///
inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned int &val);
#ifdef _WIN64
///
/// Packs a size_t
///
/// \param[inout] cursor Memory cursor
/// \param[in] val Variable with data to pack
///
inline void pack(_Inout_ unsigned char *&cursor, _In_ const size_t &val);
///
/// Returns packed size of a size_t
///
/// \param[in] val Data to pack
///
/// \returns Size of data when packed (in bytes)
///
inline size_t get_pk_size(_In_ const size_t &val);
///
/// Unpacks a size_t
///
/// \param[inout] cursor Memory cursor
/// \param[out] val Variable to receive unpacked value
///
inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ size_t &val);
#endif
/// ///
/// Packs a string /// Packs a string
@ -184,30 +261,92 @@ namespace eapserial
namespace eapserial namespace eapserial
{ {
template <class T> inline void pack(_Inout_ unsigned char *&cursor, _In_ const bool &val)
inline void pack(_Inout_ unsigned char *&cursor, _In_ const T &val)
{ {
memcpy(cursor, &val, sizeof(T)); *cursor = val ? 1 : 0;
cursor += sizeof(T); cursor++;
} }
template <class T> inline size_t get_pk_size(_In_ const bool &val)
inline size_t get_pk_size(_In_ const T &val)
{ {
UNREFERENCED_PARAMETER(val); UNREFERENCED_PARAMETER(val);
return sizeof(T); return sizeof(unsigned char);
} }
template <class T> inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ bool &val)
inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ T &val)
{ {
memcpy(&val, cursor, sizeof(T)); val = *cursor ? true : false;
cursor += sizeof(T); cursor++;
} }
inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned char &val)
{
*cursor = val;
cursor++;
}
inline size_t get_pk_size(_In_ const unsigned char &val)
{
UNREFERENCED_PARAMETER(val);
return sizeof(unsigned char);
}
inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned char &val)
{
val = *cursor;
cursor++;
}
inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned int &val)
{
*(unsigned int*)cursor = val;
cursor += sizeof(unsigned int);
}
inline size_t get_pk_size(_In_ const unsigned int &val)
{
UNREFERENCED_PARAMETER(val);
return sizeof(unsigned int);
}
inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned int &val)
{
val = *(unsigned int*)cursor;
cursor += sizeof(unsigned int);
}
#ifdef _WIN64
inline void pack(_Inout_ unsigned char *&cursor, _In_ const size_t &val)
{
*(size_t*)cursor = val;
cursor += sizeof(size_t);
}
inline size_t get_pk_size(_In_ const size_t &val)
{
UNREFERENCED_PARAMETER(val);
return sizeof(size_t);
}
inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ size_t &val)
{
val = *(size_t*)cursor;
cursor += sizeof(size_t);
}
#endif
template<class _Elem, class _Traits, class _Ax> template<class _Elem, class _Traits, class _Ax>
inline void pack(_Inout_ unsigned char *&cursor, _In_ const std::basic_string<_Elem, _Traits, _Ax> &val) inline void pack(_Inout_ unsigned char *&cursor, _In_ const std::basic_string<_Elem, _Traits, _Ax> &val)
{ {