Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 9675 in orxonox.OLD for trunk/src/lib/lang/new_object_list.cc


Ignore:
Timestamp:
Aug 21, 2006, 10:57:35 PM (18 years ago)
Author:
bensch
Message:

orxonox/trunk: more Implementation of Functionality.
Introduced map for fast search of ID/Name pairs.
This will also be used to speedup the Factory create-process

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/lang/new_object_list.cc

    r9671 r9675  
    2323    : _id(-1), _name(className)
    2424{
    25   if (NewObjectListBase::_classes == NULL)
    26     NewObjectListBase::_classes = new cSet;
     25  if (NewObjectListBase::_classesByID == NULL)
     26  {
     27    NewObjectListBase::_classesByID = new classIDMap;
     28    assert (NewObjectListBase::_classesByName == NULL);
     29    NewObjectListBase::_classesByName = new classNameMap;
     30  }
     31  assert(!NewObjectListBase::classNameExists(className) && "Classes should only be included once, and no two classes should have the same name/ID (key value)");
    2732
    28 
    29   assert(!NewObjectListBase::classNameExists(className) && "Classes should not be included once, and no two classes should have the same name (key value)");
    3033
    3134  this->_id = NewObjectListBase::_idCounter++;
    3235
     36  (*NewObjectListBase::_classesByID)[this->_id] = this;
     37  (*NewObjectListBase::_classesByName)[this->_name] = this;
    3338}
    3439
    3540NewObjectListBase::~NewObjectListBase()
    3641{
     42  NewObjectListBase::_classesByName->erase(this->_name);
     43  NewObjectListBase::_classesByID->erase(this->_id);
    3744
     45  if (NewObjectListBase::_classesByID->empty())
     46  {
     47    delete NewObjectListBase::_classesByID;
     48    NewObjectListBase::_classesByID = NULL;
     49    assert(NewObjectListBase::_classesByName != NULL);
     50    delete NewObjectListBase::_classesByName;
     51    NewObjectListBase::_classesByName = NULL;
     52  }
    3853}
    3954
    4055int NewObjectListBase::_idCounter = 0;
    41 NewObjectListBase::cSet* NewObjectListBase::_classes = NULL;
     56NewObjectListBase::classIDMap* NewObjectListBase::_classesByID = NULL;
     57NewObjectListBase::classNameMap* NewObjectListBase::_classesByName = NULL;
    4258
    4359
     
    5066bool NewObjectListBase::classNameExists(const std::string& name)
    5167{
    52   cSet::iterator it;
    53   for (it = NewObjectListBase::_classes->begin(); it != NewObjectListBase::_classes->end(); it++)
    54     if(*it != NULL && (*it)->name() != name)
    55       return true;
    56   return false;
     68  return (NewObjectListBase::_classesByName->find(name) != NewObjectListBase::_classesByName->end());
     69  //  classNameMap::iterator it;
     70  //   for (it = NewObjectListBase::_classesByID->begin(); it != NewObjectListBase::_classesByID->end(); it++)
     71  //     if(*it != NULL && (*it)->name() != name)
     72  //       return true;
     73  //   return false;
    5774}
     75
     76
     77/**
     78 * @brief Converts an ID into a ClassName String.
     79 * @param classID The ID to convert.
     80 * @return The ClassName or an empty string if the ID was not found.
     81 */
     82const std::string& NewObjectListBase::IDToString(int classID)
     83{
     84  assert (NewObjectListBase::_classesByID != NULL);
     85  NewObjectListBase::classIDMap::iterator it = NewObjectListBase::_classesByID->find(classID);
     86  if (it != NewObjectListBase::_classesByID->end())
     87    return (*it).second->name();
     88  else
     89  {
     90    static std::string empty;
     91    return empty;
     92  }
     93}
     94
     95
     96/**
     97 * @brief Converts a String into an ID
     98 * @param className the Name of the Class to search for
     99 * @return The Classes ID if found, -1 otherwise.
     100 */
     101int NewObjectListBase::StringToID(const std::string& className)
     102{
     103  assert (NewObjectListBase::_classesByName != NULL);
     104  NewObjectListBase::classNameMap::iterator it = NewObjectListBase::_classesByName->find(className);
     105  if (it != NewObjectListBase::_classesByName->end())
     106    return (*it).second->id();
     107  else
     108    return -1;
     109}
     110
Note: See TracChangeset for help on using the changeset viewer.