Skip to content

Commit

Permalink
Add a static version of Object::cast_to()
Browse files Browse the repository at this point in the history
This is to prepare to replace all instances of the member version of
cast_to().
  • Loading branch information
hpvb committed Aug 24, 2017
1 parent f61e869 commit 4aa2c18
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions core/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,46 @@ class Object {
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
Expand Down

0 comments on commit 4aa2c18

Please sign in to comment.