24 #ifndef LSST_UTILS_PYTHON_TEMPLATEINVOKER_H 25 #define LSST_UTILS_PYTHON_TEMPLATEINVOKER_H 27 #include "pybind11/pybind11.h" 28 #include "pybind11/numpy.h" 32 namespace lsst {
namespace utils {
namespace python {
110 template <
typename ...Types>
118 PyErr_Format(PyExc_TypeError,
"dtype '%R' not supported.", dtype.ptr());
119 throw pybind11::error_already_set();
155 template <
typename Function,
typename ...TypesToTry>
158 pybind11::dtype
const & dtype,
161 return _apply(
function, dtype, typesToTry);
166 template <
typename Function>
167 pybind11::object _apply(Function &
function, pybind11::dtype
const & dtype,
Tag<>)
const {
168 return _onError(dtype);
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)));
177 return _apply(
function, dtype,
Tag<A...>());
TemplateInvoker(OnErrorCallback onError)
Construct a TemplateInvoker that calls the given object when no match is found.
A helper class for wrapping C++ template functions as Python functions with dtype arguments...
A base class for image defects.
TemplateInvoker()
Construct a TemplateInvoker that calls handleErrorDefault when no match is found. ...
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...
A simple tag type used to pass one or more types as a function argument.
static pybind11::object handleErrorDefault(pybind11::dtype const &dtype)
Callback used for handling unmatched-type errors by default.