LSSTApplications
20.0.0
LSSTDataManagementBasePackage
stack
1a1d771
Linux64
sphgeom
20.0.0
include
lsst
sphgeom
codec.h
Go to the documentation of this file.
1
/*
2
* LSST Data Management System
3
* Copyright 2016 AURA/LSST.
4
*
5
* This product includes software developed by the
6
* LSST Project (http://www.lsst.org/).
7
*
8
* This program is free software: you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation, either version 3 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the LSST License Statement and
19
* the GNU General Public License along with this program. If not,
20
* see <https://www.lsstcorp.org/LegalNotices/>.
21
*/
22
23
#ifndef LSST_SPHGEOM_CODEC_H_
24
#define LSST_SPHGEOM_CODEC_H_
25
29
30
#include <vector>
31
32
33
namespace
lsst
{
34
namespace
sphgeom {
35
38
inline
void
encodeDouble
(
double
item,
std::vector<uint8_t>
& buffer) {
39
#if defined(__x86_64__)
40
// x86-64 is little endian.
41
auto
ptr
=
reinterpret_cast<
uint8_t
const
*
>
(&item);
42
buffer.
insert
(buffer.
end
(),
ptr
,
ptr
+ 8);
43
#else
44
union
{ uint64_t u;
double
d };
45
d = item;
46
buffer.
push_back
(
static_cast<
uint8_t
>
(value));
47
buffer.
push_back
(
static_cast<
uint8_t
>
(value >> 8));
48
buffer.
push_back
(
static_cast<
uint8_t
>
(value >> 16));
49
buffer.
push_back
(
static_cast<
uint8_t
>
(value >> 24));
50
buffer.
push_back
(
static_cast<
uint8_t
>
(value >> 32));
51
buffer.
push_back
(
static_cast<
uint8_t
>
(value >> 40));
52
buffer.
push_back
(
static_cast<
uint8_t
>
(value >> 48));
53
buffer.
push_back
(
static_cast<
uint8_t
>
(value >> 56));
54
#endif
55
}
56
59
inline
double
decodeDouble
(uint8_t
const
* buffer) {
60
#if defined(__x86_64__)
61
// x86-64 is little endian and supports unaligned loads.
62
return
*
reinterpret_cast<
double
const
*
>
(buffer);
63
#else
64
union
{ uint64_t u;
double
d };
65
u =
static_cast<
uint64_t
>
(buffer[0]) +
66
(
static_cast<
uint64_t
>
(buffer[1]) << 8) +
67
(
static_cast<
uint64_t
>
(buffer[2]) << 16) +
68
(
static_cast<
uint64_t
>
(buffer[3]) << 24) +
69
(
static_cast<
uint64_t
>
(buffer[4]) << 32) +
70
(
static_cast<
uint64_t
>
(buffer[5]) << 40) +
71
(
static_cast<
uint64_t
>
(buffer[6]) << 48) +
72
(
static_cast<
uint64_t
>
(buffer[7]) << 56);
73
return
d;
74
#endif
75
}
76
77
}}
// namespace lsst::sphgeom
78
79
#endif // LSST_SPHGEOM_CODEC_H_
std::vector
STL class.
std::vector::push_back
T push_back(T... args)
ptr
uint64_t * ptr
Definition:
RangeSet.cc:88
lsst
A base class for image defects.
Definition:
imageAlgorithm.dox:1
lsst::sphgeom::decodeDouble
double decodeDouble(uint8_t const *buffer)
decode extracts an IEEE double from the 8 byte little-endian byte sequence in buffer.
Definition:
codec.h:59
std::vector::insert
T insert(T... args)
std::vector::end
T end(T... args)
lsst::sphgeom::encodeDouble
void encodeDouble(double item, std::vector< uint8_t > &buffer)
encode appends an IEEE double in little-endian byte order to the end of buffer.
Definition:
codec.h:38
Generated on Wed Jun 24 2020 18:10:12 for LSSTApplications by
1.8.18