Skip to main content

History: Name Generator

Source of version: 2 (current)

Copy to clipboard
            {maketoc}

!!About the Name Generator
The following class is based on [http://www.ogre3d.org/forums/viewtopic.php?f=2&t=58048|a forum thread].

This class helps with giving unique names to your Ogre objects (and other objects as well).

!!Source Code
__NameGenerator.h__
{CODE(wrap="1", colors="c++")}
#ifndef NAME_GENERATOR_H
#define NAME_GENERATOR_H
#include <string>
#include <cstdint>

/**
 * \brief   A utility class to generate unique names.
**/
class NameGenerator
{
public:

   /**
    * \brief   Gets the next unique name.
   **/
   static std::string Next();

   /**
    * \brief   Gets the next unique name for a given prefix.
   **/
   static std::string Next(const std::string& prefix);

   /**
    * \brief   Counts the number of unique auto-generated names.
   **/
   static size_t Count();

   /**
    * \brief   Counts the number of names generated for a given prefix.
    * \param   prefix   The prefix of the generated names.
   **/
   static size_t Count(const std::string& prefix);
private:
   NameGenerator();
   ~NameGenerator();

   typedef std::map<std::string, uint32_t> NameCountMap;
   static NameCountMap s_nameCount;
};
#endif
{CODE}

__NameGenerator.cpp__
{CODE(wrap="1", colors="c++")}
#include <sstream>
#include "NameGenerator.h"

const std::string DEFAULT_NAME_PREFIX = "AutoGeneratedName";
NameGenerator::NameCountMap NameGenerator::s_nameCount;
//---------------------------------------------------------------------
NameGenerator::NameGenerator()
{
}
//---------------------------------------------------------------------
NameGenerator::~NameGenerator()
{
}
//---------------------------------------------------------------------
std::string NameGenerator::Next()
{
   return Next(DEFAULT_NAME_PREFIX);
}
//---------------------------------------------------------------------
std::string NameGenerator::Next( const std::string& prefix )
{
   if (s_nameCount.count(prefix) == 0)
   {
      s_nameCount[prefix] = 0;
   }
   std::stringstream ss;
   ss<<prefix<<"_"<<s_nameCount[prefix]++;
   return ss.str();
}
//---------------------------------------------------------------------
size_t NameGenerator::Count()
{
   size_t count = Count(DEFAULT_NAME_PREFIX);
   return count;
}
//---------------------------------------------------------------------
size_t NameGenerator::Count( const std::string& prefix )
{
   size_t count = (s_nameCount.count(prefix) == 0)?0:s_nameCount[prefix];
   return count;
}
{CODE}

!!Usage
{CODE(wrap="1", colors="c++")}
std::string autogenerated_name = NameGenerator::Next();      // Generates (from the above code) 'AutoGeneratedName_x', where x is a number
std::string new_entity_name = NameGenerator::Next("Entity"); // Generates 'Entity_x', where x is a number

// Usage example with Ogre:
Ogre::Entity* Mass = mSceneMgr->createEntity(NameGenerator::Next("Entity"), "lightsphere.mesh");
{CODE}
As this class has only static functions, you don't need to create an instance of it.