summaryrefslogtreecommitdiff
path: root/core/object.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/object.h')
-rw-r--r--core/object.h45
1 files changed, 23 insertions, 22 deletions
diff --git a/core/object.h b/core/object.h
index 43d77ed49d..746450ef6a 100644
--- a/core/object.h
+++ b/core/object.h
@@ -185,6 +185,7 @@ struct MethodInfo {
uint32_t flags;
int id;
+ inline bool operator==(const MethodInfo &p_method) const { return id == p_method.id; }
inline bool operator<(const MethodInfo &p_method) const { return id == p_method.id ? (name < p_method.name) : (id < p_method.id); }
operator Dictionary() const;
@@ -558,46 +559,46 @@ public:
void add_change_receptor(Object *p_receptor);
void remove_change_receptor(Object *p_receptor);
-// TODO: ensure 'this' is never NULL since it's UB, but by now, avoid warning flood
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wundefined-bool-conversion"
-#endif
-
template <class T>
- T *cast_to() {
-
+ 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 SAFE_CAST<T *>(this);
+ return dynamic_cast<T *>(p_object);
#else
- if (!this)
+ if (!p_object)
return NULL;
- if (is_class_ptr(T::get_class_ptr_static()))
- return static_cast<T *>(this);
+ if (p_object->is_class_ptr(T::get_class_ptr_static()))
+ return static_cast<T *>(p_object);
else
return NULL;
#endif
}
template <class T>
- const T *cast_to() const {
-
+ 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 SAFE_CAST<const T *>(this);
+ return dynamic_cast<const T *>(p_object);
#else
- if (!this)
+ if (!p_object)
return NULL;
- if (is_class_ptr(T::get_class_ptr_static()))
- return static_cast<const T *>(this);
+ if (p_object->is_class_ptr(T::get_class_ptr_static()))
+ return static_cast<const T *>(p_object);
else
return NULL;
#endif
}
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
enum {
NOTIFICATION_POSTINITIALIZE = 0,