  | 
   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.
 
 
 |