ObjDefManager: Set replacement object's handle info after calling set()

Make gamedef optional when constructing an ObjDefManager
Add note about object ownership
master
kwolekr 2015-05-03 22:05:24 -04:00
parent 5704fb36d2
commit 5b237b4d94
2 changed files with 15 additions and 3 deletions

View File

@ -434,7 +434,7 @@ void GenerateNotifier::getEvents(
ObjDefManager::ObjDefManager(IGameDef *gamedef, ObjDefType type) ObjDefManager::ObjDefManager(IGameDef *gamedef, ObjDefType type)
{ {
m_objtype = type; m_objtype = type;
m_ndef = gamedef->getNodeDefManager(); m_ndef = gamedef ? gamedef->getNodeDefManager() : NULL;
} }
@ -471,7 +471,16 @@ ObjDef *ObjDefManager::get(ObjDefHandle handle) const
ObjDef *ObjDefManager::set(ObjDefHandle handle, ObjDef *obj) ObjDef *ObjDefManager::set(ObjDefHandle handle, ObjDef *obj)
{ {
u32 index = validateHandle(handle); u32 index = validateHandle(handle);
return (index != OBJDEF_INVALID_INDEX) ? setRaw(index, obj) : NULL; if (index == OBJDEF_INVALID_INDEX)
return NULL;
ObjDef *oldobj = setRaw(index, obj);
obj->uid = oldobj->uid;
obj->index = oldobj->index;
obj->handle = oldobj->handle;
return oldobj;
} }

View File

@ -206,12 +206,15 @@ public:
std::string name; std::string name;
}; };
// WARNING: Ownership of ObjDefs is transferred to the ObjDefManager it is
// added/set to. Note that ObjDefs managed by ObjDefManager are NOT refcounted,
// so the same ObjDef instance must not be referenced multiple
class ObjDefManager { class ObjDefManager {
public: public:
ObjDefManager(IGameDef *gamedef, ObjDefType type); ObjDefManager(IGameDef *gamedef, ObjDefType type);
virtual ~ObjDefManager(); virtual ~ObjDefManager();
virtual const char *getObjectTitle() const = 0; virtual const char *getObjectTitle() const { return "ObjDef"; }
virtual void clear(); virtual void clear();
virtual ObjDef *getByName(const std::string &name) const; virtual ObjDef *getByName(const std::string &name) const;