mirror of
https://github.com/godotengine/godot.git
synced 2024-11-21 03:18:37 +08:00
Add a static version of Object::cast_to()
This is to prepare to replace all instances of the member version of cast_to().
This commit is contained in:
parent
f61e8695c9
commit
4aa2c18cb4
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user