bool ClassNameTreeContains(const ClassNameNode& node, const std::string& name) { // if the node is the name, return true if(node.name() == name) return true; // else search in parents bool bContains = false; for(size_t i = 0; i < node.num_base_classes(); ++i) bContains |= ClassNameTreeContains(node.base_class(i), name); // return if found in parents return bContains; }
int UGIsBaseClass(lua_State *L) { const char* derivClass = lua_tostring(L, -1); const char* baseClass = lua_tostring(L, -2); if(!derivClass || !baseClass) UG_THROW("In UGIsBaseClass: invalid class names passed as arguments."); luaL_getmetatable(L, derivClass); if(!lua_isnil(L, -1)) { lua_pushstring(L, "class_name_node"); lua_rawget(L, -2); const ug::bridge::ClassNameNode* classNameNode = (const ug::bridge::ClassNameNode*) lua_touserdata(L, -1); lua_pop(L, 2); if(classNameNode) { if(!classNameNode->empty()) { if(ClassNameTreeContains(*classNameNode, baseClass)) { lua_pushboolean(L, true); return 1; } } lua_pushboolean(L, false); return 1; } else UG_THROW("In UGIsBaseClasse: Something wrong with ClassNameNode."); } else{ UG_THROW("In UGIsBaseClass: Cannot find metatable for: "<< derivClass); } return 0; }