This commit is contained in:
blueloveTH 2023-03-13 16:09:22 +08:00
parent a4d9f8dc82
commit 44afa5b023
2 changed files with 15 additions and 10 deletions

View File

@ -431,8 +431,8 @@ struct pointer {
};
template<typename T>
std::enable_if_t<std::is_pointer_v<T>, T>
py_cast(VM* vm, const PyVar& var){
T py_pointer_cast(VM* vm, const PyVar& var){
static_assert(std::is_pointer_v<T>);
Pointer& p = CAST(Pointer&, var);
const TypeInfo* type = _type_db.get<typename pointer<T>::baseT>();
const int level = pointer<T>::level;

View File

@ -178,26 +178,31 @@ template <typename T> struct is_py_class<T, std::void_t<decltype(T::_type)>> : s
template<typename T>
void _check_py_class(VM* vm, const PyVar& var);
template<typename T>
T py_pointer_cast(VM* vm, const PyVar& var);
template<typename __T>
std::enable_if_t<!std::is_pointer_v<__T>, __T>
py_cast(VM* vm, const PyVar& obj) {
__T py_cast(VM* vm, const PyVar& obj) {
if constexpr(std::is_pointer_v<__T>){
return py_pointer_cast<__T>(vm, obj);
}
using T = std::decay_t<__T>;
if constexpr(is_py_class<T>::value){
_check_py_class<T>(vm, obj);
return OBJ_GET(T, obj);
}else{
throw std::runtime_error("bad py_cast() call");
}
throw std::runtime_error("bad py_cast() call");
}
template<typename __T>
std::enable_if_t<!std::is_pointer_v<__T>, __T>
_py_cast(VM* vm, const PyVar& obj) {
__T _py_cast(VM* vm, const PyVar& obj) {
if constexpr(std::is_pointer_v<__T>){
return py_pointer_cast<__T>(vm, obj);
}
using T = std::decay_t<__T>;
if constexpr(is_py_class<T>::value){
return OBJ_GET(T, obj);
}else{
throw std::runtime_error("bad py_cast() call");
}
throw std::runtime_error("bad py_cast() call");
}
#define VAR(x) py_var(vm, x)