30#ifndef LSST_SPHGEOM_CODEC_H_
31#define LSST_SPHGEOM_CODEC_H_
34#if defined(__x86_64__) or \
35 (defined(__aarch64__) and \
36 (defined(__LITTLE_ENDIAN__) or \
37 (defined(__BYTE_ORDER__) and __BYTE_ORDER__ == 1234)))
38#define OPTIMIZED_LITTLE_ENDIAN
41#ifdef NO_OPTIMIZED_PATHS
42#undef OPTIMIZED_LITTLE_ENDIAN
57inline void encodeDouble(
double item, std::vector<std::uint8_t> & buffer) {
58#ifdef OPTIMIZED_LITTLE_ENDIAN
59 auto ptr =
reinterpret_cast<std::uint8_t
const *
>(&item);
60 buffer.insert(buffer.end(), ptr, ptr + 8);
62 union { std::uint64_t u;
double d; };
64 buffer.push_back(
static_cast<std::uint8_t
>(u));
65 buffer.push_back(
static_cast<std::uint8_t
>(u >> 8));
66 buffer.push_back(
static_cast<std::uint8_t
>(u >> 16));
67 buffer.push_back(
static_cast<std::uint8_t
>(u >> 24));
68 buffer.push_back(
static_cast<std::uint8_t
>(u >> 32));
69 buffer.push_back(
static_cast<std::uint8_t
>(u >> 40));
70 buffer.push_back(
static_cast<std::uint8_t
>(u >> 48));
71 buffer.push_back(
static_cast<std::uint8_t
>(u >> 56));
78#ifdef OPTIMIZED_LITTLE_ENDIAN
79 return *
reinterpret_cast<double const *
>(buffer);
81 union { std::uint64_t u;
double d; };
82 u =
static_cast<std::uint64_t
>(buffer[0]) +
83 (
static_cast<std::uint64_t
>(buffer[1]) << 8) +
84 (
static_cast<std::uint64_t
>(buffer[2]) << 16) +
85 (
static_cast<std::uint64_t
>(buffer[3]) << 24) +
86 (
static_cast<std::uint64_t
>(buffer[4]) << 32) +
87 (
static_cast<std::uint64_t
>(buffer[5]) << 40) +
88 (
static_cast<std::uint64_t
>(buffer[6]) << 48) +
89 (
static_cast<std::uint64_t
>(buffer[7]) << 56);
96inline void encodeU64(std::uint64_t item, std::vector<std::uint8_t> & buffer) {
97#ifdef OPTIMIZED_LITTLE_ENDIAN
98 auto ptr =
reinterpret_cast<std::uint8_t
const *
>(&item);
99 buffer.insert(buffer.end(), ptr, ptr + 8);
101 union { std::uint64_t u;
double d; };
103 buffer.push_back(
static_cast<std::uint8_t
>(u));
104 buffer.push_back(
static_cast<std::uint8_t
>(u >> 8));
105 buffer.push_back(
static_cast<std::uint8_t
>(u >> 16));
106 buffer.push_back(
static_cast<std::uint8_t
>(u >> 24));
107 buffer.push_back(
static_cast<std::uint8_t
>(u >> 32));
108 buffer.push_back(
static_cast<std::uint8_t
>(u >> 40));
109 buffer.push_back(
static_cast<std::uint8_t
>(u >> 48));
110 buffer.push_back(
static_cast<std::uint8_t
>(u >> 56));
116inline std::uint64_t
decodeU64(std::uint8_t
const * buffer) {
117#ifdef OPTIMIZED_LITTLE_ENDIAN
118 return *
reinterpret_cast<std::uint64_t
const *
>(buffer);
120 std::uint64_t u =
static_cast<std::uint64_t
>(buffer[0]) +
121 (
static_cast<std::uint64_t
>(buffer[1]) << 8) +
122 (
static_cast<std::uint64_t
>(buffer[2]) << 16) +
123 (
static_cast<std::uint64_t
>(buffer[3]) << 24) +
124 (
static_cast<std::uint64_t
>(buffer[4]) << 32) +
125 (
static_cast<std::uint64_t
>(buffer[5]) << 40) +
126 (
static_cast<std::uint64_t
>(buffer[6]) << 48) +
127 (
static_cast<std::uint64_t
>(buffer[7]) << 56);
double decodeDouble(std::uint8_t const *buffer)
Definition codec.h:77
void encodeDouble(double item, std::vector< std::uint8_t > &buffer)
Definition codec.h:57
std::uint64_t decodeU64(std::uint8_t const *buffer)
Definition codec.h:116
void encodeU64(std::uint64_t item, std::vector< std::uint8_t > &buffer)
Definition codec.h:96