blob: 19d4437dcc7f31d1fa9b74c9cc8c6e35268f60b7 [file] [log] [blame]
#pragma once
#include <pybind11/pybind11.h>
#include <c10/util/strong_type.h>
#include <torch/csrc/utils/pybind.h>
#include <torch/csrc/utils/python_numbers.h>
namespace pybind11 {
namespace detail {
// Strong typedefs don't make much sense in Python since everything is duck
// typed. So instead we simply extract the underlying value and let the caller
// handle correctness.
template <typename T>
struct strong_pointer_type_caster {
template <typename T_>
static handle cast(
T_&& src,
return_value_policy /*policy*/,
handle /*parent*/) {
const auto* ptr = reinterpret_cast<const void*>(src.value_of());
return ptr ? handle(THPUtils_packUInt64(reinterpret_cast<intptr_t>(ptr)))
: none();
}
bool load(handle /*src*/, bool /*convert*/) {
return false;
}
PYBIND11_TYPE_CASTER(T, _("strong_pointer"));
};
template <typename T>
struct strong_uint_type_caster {
template <typename T_>
static handle cast(
T_&& src,
return_value_policy /*policy*/,
handle /*parent*/) {
return handle(THPUtils_packUInt64(src.value_of()));
}
bool load(handle /*src*/, bool /*convert*/) {
return false;
}
PYBIND11_TYPE_CASTER(T, _("strong_uint"));
};
} // namespace detail
} // namespace pybind11