olm/include/axolotl/pickle.hh
2015-06-12 16:15:37 +01:00

164 lines
3.1 KiB
C++

#ifndef AXOLOTL_PICKLE_HH_
#define AXOLOTL_PICKLE_HH_
#include "axolotl/list.hh"
#include "axolotl/crypto.hh"
#include <cstring>
#include <cstdint>
namespace axolotl {
static std::size_t pickle_length(
const std::uint32_t & value
) {
return 4;
}
static std::uint8_t * pickle(
std::uint8_t * pos,
std::uint32_t value
) {
pos += 4;
for (unsigned i = 4; i--;) { *(--pos) = value; value >>= 8; }
return pos + 4;
}
static std::uint8_t const * unpickle(
std::uint8_t const * pos, std::uint8_t const * end,
std::uint32_t & value
) {
value = 0;
if (end - pos < 4) return end;
for (unsigned i = 4; i--;) { value <<= 8; value |= *(pos++); }
return pos;
}
static std::size_t pickle_length(
const bool & value
) {
return 1;
}
static std::uint8_t * pickle(
std::uint8_t * pos,
bool value
) {
*(pos++) = value ? 1 : 0;
return pos;
}
static std::uint8_t const * unpickle(
std::uint8_t const * pos, std::uint8_t const * end,
bool & value
) {
if (pos == end) return end;
value = *(pos++);
return pos;
}
template<typename T, std::size_t max_size>
std::size_t pickle_length(
axolotl::List<T, max_size> const & list
) {
std::size_t length = pickle_length(std::uint32_t(list.size()));
for (auto const & value : list) {
length += pickle_length(value);
}
return length;
}
template<typename T, std::size_t max_size>
std::uint8_t * pickle(
std::uint8_t * pos,
axolotl::List<T, max_size> const & list
) {
pos = pickle(pos, std::uint32_t(list.size()));
for (auto const & value : list) {
pos = pickle(pos, value);
}
return pos;
}
template<typename T, std::size_t max_size>
std::uint8_t const * unpickle(
std::uint8_t const * pos, std::uint8_t const * end,
axolotl::List<T, max_size> & list
) {
std::uint32_t size;
pos = unpickle(pos, end, size);
while (size--) {
T * value = list.insert(list.end());
pos = unpickle(pos, end, *value);
}
return pos;
}
static std::uint8_t * pickle_bytes(
std::uint8_t * pos,
std::uint8_t const * bytes, std::size_t bytes_length
) {
std::memcpy(pos, bytes, bytes_length);
return pos + bytes_length;
}
static std::uint8_t const * unpickle_bytes(
std::uint8_t const * pos, std::uint8_t const * end,
std::uint8_t * bytes, std::size_t bytes_length
) {
if (end - pos < bytes_length) return end;
std::memcpy(bytes, pos, bytes_length);
return pos + bytes_length;
}
std::size_t pickle_length(
const Curve25519PublicKey & value
);
std::uint8_t * pickle(
std::uint8_t * pos,
const Curve25519PublicKey & value
);
std::uint8_t const * unpickle(
std::uint8_t const * pos, std::uint8_t const * end,
Curve25519PublicKey & value
);
std::size_t pickle_length(
const Curve25519KeyPair & value
);
std::uint8_t * pickle(
std::uint8_t * pos,
const Curve25519KeyPair & value
);
std::uint8_t const * unpickle(
std::uint8_t const * pos, std::uint8_t const * end,
Curve25519KeyPair & value
);
} // namespace axolotl
#endif /* AXOLOTL_PICKLE_HH */