lsst.cpputils
g87389fa792+0bb42a27e1
Toggle main menu visibility
Loading...
Searching...
No Matches
include
lsst
cpputils
python
TemplateInvoker.h
Go to the documentation of this file.
1
// -*- lsst-c++ -*-
2
/*
3
* LSST Data Management System
4
* See COPYRIGHT file at the top of the source tree.
5
*
6
* This product includes software developed by the
7
* LSST Project (http://www.lsst.org/).
8
*
9
* This program is free software: you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation, either version 3 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the LSST License Statement and
20
* the GNU General Public License along with this program. If not,
21
* see <http://www.lsstcorp.org/LegalNotices/>.
22
*/
23
24
#ifndef LSST_CPPUTILS_PYTHON_TEMPLATEINVOKER_H
25
#define LSST_CPPUTILS_PYTHON_TEMPLATEINVOKER_H
26
27
#include "pybind11/pybind11.h"
28
#include "pybind11/numpy.h"
29
30
#include <iostream>
31
32
namespace
lsst
{
namespace
cpputils
{
namespace
python
{
33
106
class
TemplateInvoker
{
107
public
:
108
110
template
<
typename
...Types>
111
struct
Tag
{};
112
114
using
OnErrorCallback
=
std::function
<pybind11::object(pybind11::dtype
const
& dtype)>;
115
117
static
pybind11::object
handleErrorDefault
(pybind11::dtype
const
& dtype) {
118
PyErr_Format(PyExc_TypeError,
"dtype '%R' not supported."
, dtype.ptr());
119
throw
pybind11::error_already_set();
120
}
121
129
explicit
TemplateInvoker
(
OnErrorCallback
onError) : _onError(
std
::move(onError)) {}
130
132
TemplateInvoker
() :
TemplateInvoker
(
handleErrorDefault
) {}
133
155
template
<
typename
Function,
typename
...TypesToTry>
156
pybind11::object
apply
(
157
Function function,
158
pybind11::dtype
const
& dtype,
159
Tag<TypesToTry...>
typesToTry
160
)
const
{
161
return
_apply(function, dtype, typesToTry);
162
}
163
164
private
:
165
166
template
<
typename
Function>
167
pybind11::object _apply(Function & function, pybind11::dtype
const
& dtype, Tag<>)
const
{
168
return
_onError(dtype);
169
}
170
171
template
<
typename
Function,
typename
T,
typename
...A>
172
pybind11::object _apply(Function & function, pybind11::dtype
const
& dtype, Tag<T, A...>)
const
{
173
if
(pybind11::detail::npy_api::get().PyArray_EquivTypes_(dtype.ptr(),
174
pybind11::dtype::of<T>().ptr())) {
175
return
pybind11::cast(function(
static_cast<
T
>
(0)));
176
}
177
return
_apply(function, dtype, Tag<A...>());
178
}
179
180
OnErrorCallback
_onError;
181
};
182
183
}}
184
}
// namespace lsst::cpputils::python
185
186
#endif
lsst::cpputils::python::TemplateInvoker::OnErrorCallback
std::function< pybind11::object(pybind11::dtype const &dtype)> OnErrorCallback
Callback type for handling unmatched-type errors.
Definition
TemplateInvoker.h:114
lsst::cpputils::python::TemplateInvoker::apply
pybind11::object apply(Function function, pybind11::dtype const &dtype, Tag< TypesToTry... > typesToTry) const
Call and return function(static_cast<T>(0)) with the type T that matches a given NumPy dtype object.
Definition
TemplateInvoker.h:156
lsst::cpputils::python::TemplateInvoker::TemplateInvoker
TemplateInvoker()
Construct a TemplateInvoker that calls handleErrorDefault when no match is found.
Definition
TemplateInvoker.h:132
lsst::cpputils::python::TemplateInvoker::TemplateInvoker
TemplateInvoker(OnErrorCallback onError)
Construct a TemplateInvoker that calls the given object when no match is found.
Definition
TemplateInvoker.h:129
lsst::cpputils::python::TemplateInvoker::handleErrorDefault
static pybind11::object handleErrorDefault(pybind11::dtype const &dtype)
Callback used for handling unmatched-type errors by default.
Definition
TemplateInvoker.h:117
std::function
lsst::cpputils::python
Definition
python.h:44
lsst::cpputils
Definition
main.dox:1
lsst
std
STL namespace.
lsst::cpputils::python::TemplateInvoker::Tag
A simple tag type used to pass one or more types as a function argument.
Definition
TemplateInvoker.h:111
Generated on
for lsst.cpputils by
1.17.0