Seastar
High performance C++ framework for concurrent servers
indirect.hh
1/*
2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
6 *
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
16 * under the License.
17 */
18/*
19 * Copyright (C) 2016 ScyllaDB
20 */
21
22#pragma once
23
24#include <memory>
25
26namespace seastar {
27
28// This header defines functors for comparing and hashing pointers by pointed-to values instead of pointer addresses.
29//
30// Examples:
31//
32// std::multiset<shared_ptr<sstring>, indirect_less<shared_ptr<sstring>>> _multiset;
33//
34// std::unordered_map<shared_ptr<sstring>, bool,
35// indirect_hash<shared_ptr<sstring>>, indirect_equal_to<shared_ptr<sstring>>> _unordered_map;
36//
37
38template<typename Pointer, typename Equal = std::equal_to<typename std::pointer_traits<Pointer>::element_type>>
40 Equal _eq;
41 indirect_equal_to(Equal eq = Equal()) : _eq(std::move(eq)) {}
42 bool operator()(const Pointer& i1, const Pointer& i2) const {
43 if (bool(i1) ^ bool(i2)) {
44 return false;
45 }
46 return !i1 || _eq(*i1, *i2);
47 }
48};
49
50template<typename Pointer, typename Less = std::less<typename std::pointer_traits<Pointer>::element_type>>
52 Less _cmp;
53 indirect_less(Less cmp = Less()) : _cmp(std::move(cmp)) {}
54 bool operator()(const Pointer& i1, const Pointer& i2) const {
55 if (i1 && i2) {
56 return _cmp(*i1, *i2);
57 }
58 return !i1 && i2;
59 }
60};
61
62template<typename Pointer, typename Hash = std::hash<typename std::pointer_traits<Pointer>::element_type>>
64 Hash _h;
65 indirect_hash(Hash h = Hash()) : _h(std::move(h)) {}
66 size_t operator()(const Pointer& p) const {
67 if (p) {
68 return _h(*p);
69 }
70 return 0;
71 }
72};
73
74}
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
Definition: indirect.hh:39
Definition: indirect.hh:63
Definition: indirect.hh:51