]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/spatialdb/utils.h
1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under the BSD-style license found in the
3 // LICENSE file in the root directory of this source tree. An additional grant
4 // of patent rights can be found in the PATENTS file in the same directory.
10 #include "rocksdb/utilities/spatial_db.h"
15 // indexing idea from http://msdn.microsoft.com/en-us/library/bb259689.aspx
16 inline uint64_t GetTileFromCoord(double x
, double start
, double end
,
21 uint64_t tiles
= 1ull << tile_bits
;
22 uint64_t r
= static_cast<uint64_t>(((x
- start
) / (end
- start
)) * tiles
);
23 return std::min(r
, tiles
- 1);
26 inline uint64_t GetQuadKeyFromTile(uint64_t tile_x
, uint64_t tile_y
,
28 uint64_t quad_key
= 0;
29 for (uint32_t i
= 0; i
< tile_bits
; ++i
) {
30 uint64_t mask
= (1ull << i
);
31 quad_key
|= (tile_x
& mask
) << i
;
32 quad_key
|= (tile_y
& mask
) << (i
+ 1);
37 inline BoundingBox
<uint64_t> GetTileBoundingBox(
38 const SpatialIndexOptions
& spatial_index
, BoundingBox
<double> bbox
) {
39 return BoundingBox
<uint64_t>(
40 GetTileFromCoord(bbox
.min_x
, spatial_index
.bbox
.min_x
,
41 spatial_index
.bbox
.max_x
, spatial_index
.tile_bits
),
42 GetTileFromCoord(bbox
.min_y
, spatial_index
.bbox
.min_y
,
43 spatial_index
.bbox
.max_y
, spatial_index
.tile_bits
),
44 GetTileFromCoord(bbox
.max_x
, spatial_index
.bbox
.min_x
,
45 spatial_index
.bbox
.max_x
, spatial_index
.tile_bits
),
46 GetTileFromCoord(bbox
.max_y
, spatial_index
.bbox
.min_y
,
47 spatial_index
.bbox
.max_y
, spatial_index
.tile_bits
));
50 // big endian can be compared using memcpy
51 inline void PutFixed64BigEndian(std::string
* dst
, uint64_t value
) {
52 char buf
[sizeof(value
)];
53 buf
[0] = (value
>> 56) & 0xff;
54 buf
[1] = (value
>> 48) & 0xff;
55 buf
[2] = (value
>> 40) & 0xff;
56 buf
[3] = (value
>> 32) & 0xff;
57 buf
[4] = (value
>> 24) & 0xff;
58 buf
[5] = (value
>> 16) & 0xff;
59 buf
[6] = (value
>> 8) & 0xff;
60 buf
[7] = value
& 0xff;
61 dst
->append(buf
, sizeof(buf
));
64 // big endian can be compared using memcpy
65 inline bool GetFixed64BigEndian(const Slice
& input
, uint64_t* value
) {
66 if (input
.size() < sizeof(uint64_t)) {
69 auto ptr
= input
.data();
70 *value
= (static_cast<uint64_t>(static_cast<unsigned char>(ptr
[0])) << 56) |
71 (static_cast<uint64_t>(static_cast<unsigned char>(ptr
[1])) << 48) |
72 (static_cast<uint64_t>(static_cast<unsigned char>(ptr
[2])) << 40) |
73 (static_cast<uint64_t>(static_cast<unsigned char>(ptr
[3])) << 32) |
74 (static_cast<uint64_t>(static_cast<unsigned char>(ptr
[4])) << 24) |
75 (static_cast<uint64_t>(static_cast<unsigned char>(ptr
[5])) << 16) |
76 (static_cast<uint64_t>(static_cast<unsigned char>(ptr
[6])) << 8) |
77 static_cast<uint64_t>(static_cast<unsigned char>(ptr
[7]));
81 inline void PutDouble(std::string
* dst
, double d
) {
82 dst
->append(reinterpret_cast<char*>(&d
), sizeof(double));
85 inline bool GetDouble(Slice
* input
, double* d
) {
86 if (input
->size() < sizeof(double)) {
89 memcpy(d
, input
->data(), sizeof(double));
90 input
->remove_prefix(sizeof(double));
94 } // namespace spatial
95 } // namespace rocksdb