lsst.afw
g3a5ebb7d8a+28b83bf6a5
Toggle main menu visibility
Loading...
Searching...
No Matches
include
lsst
afw
typehandling
detail
refwrap_utils.h
Go to the documentation of this file.
1
// -*- LSST-C++ -*-
2
/*
3
* This file is part of afw.
4
*
5
* Developed for the LSST Data Management System.
6
* This product includes software developed by the LSST Project
7
* (https://www.lsst.org).
8
* See the COPYRIGHT file at the top-level directory of this distribution
9
* for details of code ownership.
10
*
11
* This program is free software: you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License as published by
13
* the Free Software Foundation, either version 3 of the License, or
14
* (at your option) any later version.
15
*
16
* This program is distributed in the hope that it will be useful,
17
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
* GNU General Public License for more details.
20
*
21
* You should have received a copy of the GNU General Public License
22
* along with this program. If not, see <https://www.gnu.org/licenses/>.
23
*/
24
25
#ifndef LSST_AFW_TYPEHANDLING_DETAIL_REFWRAP_UTILS_H
26
#define LSST_AFW_TYPEHANDLING_DETAIL_REFWRAP_UTILS_H
27
28
#include <functional>
29
#include <variant>
30
31
namespace
lsst
{
32
namespace
afw
{
33
namespace
typehandling
{
34
namespace
detail
{
35
36
// An equality comparison function object for std::variant visitors that
37
// contain only std::reference_wrapper types. Because reference_wrapper doesn't
38
// define operator==, std::variant::operator== can't do this for us.
39
struct
refwrap_equals
{
40
41
template
<
typename
T>
42
bool
operator()
(
std::reference_wrapper<T>
a,
std::reference_wrapper<T>
b) {
43
return
a.
get
() == b.
get
();
44
}
45
46
template
<
typename
T,
typename
U>
47
bool
operator()
(
std::reference_wrapper<T>
a,
std::reference_wrapper<U>
b) {
48
static_assert
(!std::is_same_v<T, U>);
49
return
false
;
50
}
51
52
template
<
typename
...E>
53
bool
operator()
(
54
std::variant<
std::reference_wrapper<E>
...>
const
& a,
55
std::variant<
std::reference_wrapper<E>
...>
const
& b
56
) {
57
return
std::visit(*
this
, a, b);
58
}
59
60
};
61
62
// An equivalent to const_cast for std::reference_wrapper.
63
template
<
typename
T>
64
std::reference_wrapper<T>
refwrap_const_cast
(
std::reference_wrapper<T const>
const
& r) {
65
return
std::ref
(
const_cast<
T &
>
(r.
get
()));
66
}
67
68
// A visitor function wrapper for callables with two arguments, where the
69
// second is the target of a std::reference_wrapper (as is the case for
70
// GenericMap's visitation interface).
71
//
72
// Construct with the make_refwrap_visitor function.
73
template
<
typename
F>
74
class
refwrap_visitor
{
75
private
:
76
F _func;
77
public
:
78
79
explicit
refwrap_visitor
(F && func) : _func(
std
::forward(func)) {}
80
81
template
<
typename
K,
typename
V>
82
auto
operator()
(K
const
& key,
std::reference_wrapper<V>
const
& value)
const
{
83
return
_func(key, value.
get
());
84
}
85
86
};
87
88
// Specialization of refwrap_visitor for functions passed by lvalue reference.
89
//
90
// This is necessary because you can't perfectly forward an argument that you
91
// need to capture in order to use it multiple times; if it's an rvalue
92
// reference, it needs to be moved into a value (not just passed along into
93
// another function as an rvalue reference). Without a specialization, lvalue
94
// references end up being coped, so modifications to the callable would not be
95
// reflected to the caller.
96
template
<
typename
F>
97
class
refwrap_visitor
<F&> {
98
private
:
99
std::reference_wrapper<F>
_func;
100
public
:
101
102
explicit
refwrap_visitor
(F & func) : _func(
std
::ref(func)) {}
103
104
template
<
typename
K,
typename
V>
105
auto
operator()
(K
const
& key,
std::reference_wrapper<V>
const
& value)
const
{
106
return
_func(key, value.
get
());
107
}
108
109
};
110
111
// Helper function to create a refwrap_visitor instance without explicitly
112
// specifying the type of the wrapped callable.
113
template
<
typename
F>
114
refwrap_visitor<F>
make_refwrap_visitor
(F&& func) {
115
return
refwrap_visitor<F>
(
std::forward<F>
(func));
116
}
117
118
}
// namespace detail
119
}
// namespace typehandling
120
}
// namespace afw
121
}
// namespace lsst
122
123
#endif
lsst::afw::typehandling::detail::refwrap_visitor< F & >::refwrap_visitor
refwrap_visitor(F &func)
Definition
refwrap_utils.h:102
lsst::afw::typehandling::detail::refwrap_visitor< F & >::operator()
auto operator()(K const &key, std::reference_wrapper< V > const &value) const
Definition
refwrap_utils.h:105
lsst::afw::typehandling::detail::refwrap_visitor
Definition
refwrap_utils.h:74
lsst::afw::typehandling::detail::refwrap_visitor::operator()
auto operator()(K const &key, std::reference_wrapper< V > const &value) const
Definition
refwrap_utils.h:82
lsst::afw::typehandling::detail::refwrap_visitor::refwrap_visitor
refwrap_visitor(F &&func)
Definition
refwrap_utils.h:79
std::forward
T forward(T... args)
std::reference_wrapper::get
T get(T... args)
lsst::afw::typehandling::detail
Definition
refwrap_utils.h:34
lsst::afw::typehandling::detail::refwrap_const_cast
std::reference_wrapper< T > refwrap_const_cast(std::reference_wrapper< T const > const &r)
Definition
refwrap_utils.h:64
lsst::afw::typehandling::detail::make_refwrap_visitor
refwrap_visitor< F > make_refwrap_visitor(F &&func)
Definition
refwrap_utils.h:114
lsst::afw::typehandling
Definition
refwrap_utils.h:33
lsst::afw
Definition
imageAlgorithm.dox:1
lsst
std
STL namespace.
std::ref
T ref(T... args)
std::reference_wrapper
lsst::afw::typehandling::detail::refwrap_equals
Definition
refwrap_utils.h:39
lsst::afw::typehandling::detail::refwrap_equals::operator()
bool operator()(std::reference_wrapper< T > a, std::reference_wrapper< U > b)
Definition
refwrap_utils.h:47
lsst::afw::typehandling::detail::refwrap_equals::operator()
bool operator()(std::reference_wrapper< T > a, std::reference_wrapper< T > b)
Definition
refwrap_utils.h:42
lsst::afw::typehandling::detail::refwrap_equals::operator()
bool operator()(std::variant< std::reference_wrapper< E >... > const &a, std::variant< std::reference_wrapper< E >... > const &b)
Definition
refwrap_utils.h:53
Generated on
for lsst.afw by
1.17.0