blueloveTH il y a 3 ans
Parent
commit
44afa5b023
2 fichiers modifiés avec 15 ajouts et 10 suppressions
  1. 2 2
      src/cffi.h
  2. 13 8
      src/obj.h

+ 2 - 2
src/cffi.h

@@ -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;

+ 13 - 8
src/obj.h

@@ -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)