]>
git.proxmox.com Git - ceph.git/blob - 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).
9 #include "utilities/merge_operators/bytesxor.h"
11 namespace ROCKSDB_NAMESPACE
{
13 std::shared_ptr
<MergeOperator
> MergeOperators::CreateBytesXOROperator() {
14 return std::make_shared
<BytesXOROperator
>();
17 bool BytesXOROperator::Merge(const Slice
& /*key*/,
18 const Slice
* existing_value
,
20 std::string
* new_value
,
21 Logger
* /*logger*/) const {
22 XOR(existing_value
, value
, new_value
);
26 void BytesXOROperator::XOR(const Slice
* existing_value
,
27 const Slice
& value
, std::string
* new_value
) const {
28 if (!existing_value
) {
30 new_value
->assign(value
.data(), value
.size());
34 size_t min_size
= std::min(existing_value
->size(), value
.size());
35 size_t max_size
= std::max(existing_value
->size(), value
.size());
38 new_value
->reserve(max_size
);
40 const char* existing_value_data
= existing_value
->data();
41 const char* value_data
= value
.data();
43 for (size_t i
= 0; i
< min_size
; i
++) {
44 new_value
->push_back(existing_value_data
[i
] ^ value_data
[i
]);
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
]);
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
]);
59 } // namespace ROCKSDB_NAMESPACE