Bladeren bron

Add a static version of Object::cast_to()

This is to prepare to replace all instances of the member version of
cast_to().
Hein-Pieter van Braam 8 jaren geleden
bovenliggende
commit
4aa2c18cb4
1 gewijzigde bestanden met toevoegingen van 40 en 0 verwijderingen
  1. 40 0
      core/object.h

+ 40 - 0
core/object.h

@@ -558,6 +558,46 @@ public:
 	void add_change_receptor(Object *p_receptor);
 	void remove_change_receptor(Object *p_receptor);
 
+	template <class T>
+	static T *cast_to(Object *p_object) {
+#ifdef DEBUG_ENABLED
+		// TODO there are some legitimate reasons to pass NULL as p_object.
+		// we need to figure out how to deal with that in debug mode.
+		// This code will return NULL for a NULL input in release mode also.
+		ERR_FAIL_COND_V(p_object == NULL, NULL);
+#endif
+#ifndef NO_SAFE_CAST
+		return dynamic_cast<T *>(p_object);
+#else
+		if (!p_object)
+			return NULL;
+		if (p_pobject->is_class_ptr(T::get_class_ptr_static()))
+			return static_cast<T *>(p_pobject);
+		else
+			return NULL;
+#endif
+	}
+
+	template <class T>
+	static const T *cast_to(const Object *p_object) {
+#ifdef DEBUG_ENABLED
+		// TODO there are some legitimate reasons to pass NULL as p_object.
+		// we need to figure out how to deal with that in debug mode.
+		// This code will return NULL for a NULL input in release mode also.
+		ERR_FAIL_COND_V(p_object == NULL, NULL);
+#endif
+#ifndef NO_SAFE_CAST
+		return dynamic_cast<const T *>(p_object);
+#else
+		if (!p_object)
+			return NULL;
+		if (p_pobject->is_class_ptr(T::get_class_ptr_static()))
+			return static_cast<const T *>(p_object);
+		else
+			return NULL;
+#endif
+	}
+
 // TODO: ensure 'this' is never NULL since it's UB, but by now, avoid warning flood
 #ifdef __clang__
 #pragma clang diagnostic push