]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/spatialdb/utils.h
add subtree-ish sources for 12.0.3
[ceph.git] / 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.
5
6 #pragma once
7 #include <string>
8 #include <algorithm>
9
10 #include "rocksdb/utilities/spatial_db.h"
11
12 namespace rocksdb {
13 namespace spatial {
14
15 // indexing idea from http://msdn.microsoft.com/en-us/library/bb259689.aspx
16 inline uint64_t GetTileFromCoord(double x, double start, double end,
17 uint32_t tile_bits) {
18 if (x < start) {
19 return 0;
20 }
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);
24 }
25
26 inline uint64_t GetQuadKeyFromTile(uint64_t tile_x, uint64_t tile_y,
27 uint32_t tile_bits) {
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);
33 }
34 return quad_key;
35 }
36
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));
48 }
49
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));
62 }
63
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)) {
67 return false;
68 }
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]));
78 return true;
79 }
80
81 inline void PutDouble(std::string* dst, double d) {
82 dst->append(reinterpret_cast<char*>(&d), sizeof(double));
83 }
84
85 inline bool GetDouble(Slice* input, double* d) {
86 if (input->size() < sizeof(double)) {
87 return false;
88 }
89 memcpy(d, input->data(), sizeof(double));
90 input->remove_prefix(sizeof(double));
91 return true;
92 }
93
94 } // namespace spatial
95 } // namespace rocksdb