]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/merge_operators/bytesxor.cc
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / rocksdb / utilities / merge_operators / bytesxor.cc
1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
5
6 #include <algorithm>
7 #include <string>
8
9 #include "utilities/merge_operators/bytesxor.h"
10
11 namespace ROCKSDB_NAMESPACE {
12
13 std::shared_ptr<MergeOperator> MergeOperators::CreateBytesXOROperator() {
14 return std::make_shared<BytesXOROperator>();
15 }
16
17 bool BytesXOROperator::Merge(const Slice& /*key*/,
18 const Slice* existing_value,
19 const Slice& value,
20 std::string* new_value,
21 Logger* /*logger*/) const {
22 XOR(existing_value, value, new_value);
23 return true;
24 }
25
26 void BytesXOROperator::XOR(const Slice* existing_value,
27 const Slice& value, std::string* new_value) const {
28 if (!existing_value) {
29 new_value->clear();
30 new_value->assign(value.data(), value.size());
31 return;
32 }
33
34 size_t min_size = std::min(existing_value->size(), value.size());
35 size_t max_size = std::max(existing_value->size(), value.size());
36
37 new_value->clear();
38 new_value->reserve(max_size);
39
40 const char* existing_value_data = existing_value->data();
41 const char* value_data = value.data();
42
43 for (size_t i = 0; i < min_size; i++) {
44 new_value->push_back(existing_value_data[i] ^ value_data[i]);
45 }
46
47 if (existing_value->size() == max_size) {
48 for (size_t i = min_size; i < max_size; i++) {
49 new_value->push_back(existing_value_data[i]);
50 }
51 } else {
52 assert(value.size() == max_size);
53 for (size_t i = min_size; i < max_size; i++) {
54 new_value->push_back(value_data[i]);
55 }
56 }
57 }
58
59 } // namespace ROCKSDB_NAMESPACE