|
Automatic Object ID Generation
Submitted by |
Here's a little technique that I've found pretty useful but haven't seen
anywhere other than my code :).
It is pretty often that there is a number of logically grouped objects in a
program that need to contain a name and a unique ID for hashing or some
other lookup method. For instance, you might have lights named, say,
Light01, etc, cameras named Camera01, etc, static geometry named
Level01Room01 or whatever, and objects named, say, EvilDemonBoss or Bob.
There are many techniques for generating unique ID's, but there's no simple
way to generate an ID that is absolutely guaranteed to be unique without
checking the rest of the ID's.
The proposed technique takes care of that problem in a pretty simple and
straightforward way, although it requires that ID's can not be changed once
set, and that every object has a name. Here's the basic outline of the
technique using C strings, although STL strings or a custom string class
could be used as long as it's a dynamic instance (static instances won't
generate unique IDs for obvious reasons)
class Base
{
public:
Base();
~Base();
virtual char *GetName() { return strdup(m_strName); }
virtual void SetName(char *p) { m_strName = strdup(p); }
virtual long GetID() { return m_nID; }
protected:
union {
char *m_strName;
long m_nID;
};
}; |
What happens is pretty obvious: whenever a name is allocated, its pointer
is used as the ID. Pointers are unique, therefore ID's are unique.
Changing the name of an object changes its ID. The reason GetName() and
SetName() use strdup() is that otherwise objects may end up hashed under the
same ID as a result of something like
obj1.SetName(obj2.GetName());
Not an easy bug to track, so I just play it safe and don't allow direct
pointer access.
Peace,
-goltrpoat
|
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
|