memgraph/src/utils/endian.hpp
Matej Ferencevic aaf0c1ca08 Improve SLK
Summary:
SLK now correctly handles different CPU architectures (BIG/little endian).
Also, more string encoding functions have been added.

Reviewers: buda

Reviewed By: buda

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D2806
2020-08-14 15:27:20 +02:00

70 lines
2.9 KiB
C++

#pragma once
#include <endian.h>
#include "utils/cast.hpp"
namespace utils {
inline uint8_t HostToLittleEndian(uint8_t value) { return value; }
inline uint16_t HostToLittleEndian(uint16_t value) { return htole16(value); }
inline uint32_t HostToLittleEndian(uint32_t value) { return htole32(value); }
inline uint64_t HostToLittleEndian(uint64_t value) { return htole64(value); }
inline int8_t HostToLittleEndian(int8_t value) { return value; }
inline int16_t HostToLittleEndian(int16_t value) {
return MemcpyCast<int16_t>(htole16(MemcpyCast<uint16_t>(value)));
}
inline int32_t HostToLittleEndian(int32_t value) {
return MemcpyCast<int32_t>(htole32(MemcpyCast<uint32_t>(value)));
}
inline int64_t HostToLittleEndian(int64_t value) {
return MemcpyCast<int64_t>(htole64(MemcpyCast<uint64_t>(value)));
}
inline uint8_t LittleEndianToHost(uint8_t value) { return value; }
inline uint16_t LittleEndianToHost(uint16_t value) { return le16toh(value); }
inline uint32_t LittleEndianToHost(uint32_t value) { return le32toh(value); }
inline uint64_t LittleEndianToHost(uint64_t value) { return le64toh(value); }
inline int8_t LittleEndianToHost(int8_t value) { return value; }
inline int16_t LittleEndianToHost(int16_t value) {
return MemcpyCast<int16_t>(le16toh(MemcpyCast<uint16_t>(value)));
}
inline int32_t LittleEndianToHost(int32_t value) {
return MemcpyCast<int32_t>(le32toh(MemcpyCast<uint32_t>(value)));
}
inline int64_t LittleEndianToHost(int64_t value) {
return MemcpyCast<int64_t>(le64toh(MemcpyCast<uint64_t>(value)));
}
inline uint8_t HostToBigEndian(uint8_t value) { return value; }
inline uint16_t HostToBigEndian(uint16_t value) { return htobe16(value); }
inline uint32_t HostToBigEndian(uint32_t value) { return htobe32(value); }
inline uint64_t HostToBigEndian(uint64_t value) { return htobe64(value); }
inline int8_t HostToBigEndian(int8_t value) { return value; }
inline int16_t HostToBigEndian(int16_t value) {
return MemcpyCast<int16_t>(htobe16(MemcpyCast<uint16_t>(value)));
}
inline int32_t HostToBigEndian(int32_t value) {
return MemcpyCast<int32_t>(htobe32(MemcpyCast<uint32_t>(value)));
}
inline int64_t HostToBigEndian(int64_t value) {
return MemcpyCast<int64_t>(htobe64(MemcpyCast<uint64_t>(value)));
}
inline uint8_t BigEndianToHost(uint8_t value) { return value; }
inline uint16_t BigEndianToHost(uint16_t value) { return be16toh(value); }
inline uint32_t BigEndianToHost(uint32_t value) { return be32toh(value); }
inline uint64_t BigEndianToHost(uint64_t value) { return be64toh(value); }
inline int8_t BigEndianToHost(int8_t value) { return value; }
inline int16_t BigEndianToHost(int16_t value) {
return MemcpyCast<int16_t>(be16toh(MemcpyCast<uint16_t>(value)));
}
inline int32_t BigEndianToHost(int32_t value) {
return MemcpyCast<int32_t>(be32toh(MemcpyCast<uint32_t>(value)));
}
inline int64_t BigEndianToHost(int64_t value) {
return MemcpyCast<int64_t>(be64toh(MemcpyCast<uint64_t>(value)));
}
} // namespace utils