Requirements:
- Must be able to use C strings as well as C++ strings
- Fast
- No maps
- No templates
- No direct lookup, i.e. index might be out of bounds.
- Index is not consecutive
- Enums and strings contained in one header file
- Only instantiate what you use.
This is what I have come up with so far:
- test.hh -
// Generic mapper
// 
// The idea here is to create a map between an integer and a string.
// By including it inside a class we prevent every module which
// includes this include file from creating their own instance.
//
struct Mapper_s
{
   int Idx;
   const char *pStr;
};
// Status
enum State_t
{
   Running = 1,
   Jumping = 6, 
   Singing = 12
};
struct State_s
{
   static const Mapper_s *GetpMap(void)
   {
       static Mapper_s Map[] = 
       {
            { Running,   "Running" },
            { Jumping,   "Jumping" },
            { Singing,   "Singing" },
            { 0,   0}
        };
        return Map;
    };
};
- test.cc -
// This is a generic function 
const char *MapEnum2Str(int Idx, const Mapper_s *pMap)
{
    int i;
    static const char UnknownStr[] = "Unknown";
    for (i = 0; pMap[i].pStr != 0; i++)
    {
        if (Idx == pMap[i].Idx)
        {
            return pMap[i].pStr;
        }
    }
    return UnknownStr;
}
int main()
{
   cout << "State: " << MapEnum2Str(State, State_s::GetpMap()) << endl;
   return 0;
}
Any suggestions on how to improve this ?
I feel that the header file looks slightly cluttered...
 
     
     
     
     
     
    