Add serialization shortcuts for std::string and std::uintX_t types

This commit is contained in:
Martchus 2022-02-19 00:06:13 +01:00
parent b302cdfabe
commit 64ba75ac48
1 changed files with 76 additions and 0 deletions

View File

@ -2,6 +2,8 @@
#include "./lmdb-safe.hh" #include "./lmdb-safe.hh"
#include <c++utilities/conversion/binaryconversion.h>
#include <c++utilities/conversion/conversionexception.h>
#include <c++utilities/conversion/stringbuilder.h> #include <c++utilities/conversion/stringbuilder.h>
namespace LMDBSafe { namespace LMDBSafe {
@ -30,6 +32,80 @@ template <typename T> std::string serToString(const T &t);
template <typename T> void serFromString(string_view str, T &ret); template <typename T> void serFromString(string_view str, T &ret);
// define some "shortcuts" (to avoid full-blown serialization stuff for trivial cases)
template <> inline std::string serToString(const std::string_view &t)
{
return std::string(t);
}
template <> inline std::string serToString(const std::string &t)
{
return t;
}
template <> inline std::string serToString(const std::uint8_t &t)
{
return std::string(reinterpret_cast<const std::string::value_type *>(&t), sizeof(t));
}
template <> inline std::string serToString(const std::uint16_t &t)
{
auto str = std::string(sizeof(t), '\0');
CppUtilities::LE::getBytes(t, str.data());
return str;
}
template <> inline std::string serToString(const std::uint32_t &t)
{
auto str = std::string(sizeof(t), '\0');
CppUtilities::LE::getBytes(t, str.data());
return str;
}
template <> inline std::string serToString(const std::uint64_t &t)
{
auto str = std::string(sizeof(t), '\0');
CppUtilities::LE::getBytes(t, str.data());
return str;
}
template <> inline void serFromString<std::string>(string_view str, std::string &ret)
{
ret = std::string(str);
}
template <> inline void serFromString<>(string_view str, std::uint8_t &ret)
{
if (str.size() != sizeof(ret)) {
throw CppUtilities::ConversionException(CppUtilities::argsToString("value not 8-bit, got ", str.size(), " bytes instead"));
}
ret = static_cast<std::uint8_t>(*str.data());
}
template <> inline void serFromString<>(string_view str, std::uint16_t &ret)
{
if (str.size() != sizeof(ret)) {
throw CppUtilities::ConversionException(CppUtilities::argsToString("value not 16-bit, got ", str.size(), " bytes instead"));
}
ret = CppUtilities::LE::toUInt16(str.data());
}
template <> inline void serFromString<>(string_view str, std::uint32_t &ret)
{
if (str.size() != sizeof(ret)) {
throw CppUtilities::ConversionException(CppUtilities::argsToString("value not 32-bit, got ", str.size(), " bytes instead"));
}
ret = CppUtilities::LE::toUInt32(str.data());
}
template <> inline void serFromString<>(string_view str, std::uint64_t &ret)
{
if (str.size() != sizeof(ret)) {
throw CppUtilities::ConversionException(CppUtilities::argsToString("value not 64-bit, got ", str.size(), " bytes instead"));
}
ret = CppUtilities::LE::toUInt64(str.data());
}
/** This is the serialization interface for keys. /** This is the serialization interface for keys.
You need to define your these functions for the types you'd like to use as keys. You need to define your these functions for the types you'd like to use as keys.
*/ */