mdds
Loading...
Searching...
No Matches
include
mdds
cref_wrapper.hpp
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*************************************************************************
3
*
4
* Copyright (c) 2024 Kohei Yoshida
5
*
6
* Permission is hereby granted, free of charge, to any person
7
* obtaining a copy of this software and associated documentation
8
* files (the "Software"), to deal in the Software without
9
* restriction, including without limitation the rights to use,
10
* copy, modify, merge, publish, distribute, sublicense, and/or sell
11
* copies of the Software, and to permit persons to whom the
12
* Software is furnished to do so, subject to the following
13
* conditions:
14
*
15
* The above copyright notice and this permission notice shall be
16
* included in all copies or substantial portions of the Software.
17
*
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25
* OTHER DEALINGS IN THE SOFTWARE.
26
*
27
************************************************************************/
28
29
#pragma once
30
31
#include <functional>
32
#include <type_traits>
33
34
namespace
mdds {
namespace
detail {
35
40
template
<
typename
T>
41
class
cref_wrapper
42
{
43
std::reference_wrapper<std::add_const_t<T>> m_value;
44
45
public
:
46
cref_wrapper
(
const
T& v) : m_value(std::cref(v))
47
{}
48
49
const
T& get()
const
50
{
51
return
m_value;
52
}
53
54
bool
operator==(
const
cref_wrapper
& r)
const
55
{
56
return
get() == r.get();
57
}
58
59
bool
operator!=(
const
cref_wrapper
& r)
const
60
{
61
return
!operator==(r);
62
}
63
64
struct
hash
65
{
66
std::size_t operator()(
const
cref_wrapper
& v)
const
67
{
68
// NB: hash value must be based on the wrapped value, else two
69
// identical values located in different memory locations may end up
70
// in different buckets, and the lookup may fail.
71
return
std::hash<T>{}(
v
.m_value);
72
}
73
};
74
};
75
76
}}
// namespace mdds::detail
77
78
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
mdds::detail::cref_wrapper
Definition
cref_wrapper.hpp:42
mdds::detail::cref_wrapper::hash
Definition
cref_wrapper.hpp:65
Generated on Fri Jul 11 2025 15:10:13 for mdds by
1.9.8