Configurable Items Example

This is a quick example of how the configurable items manager (as described in Don’t Shoot the Reviewer ) could work.

#include <string>
#include <iostream>
#include <map>
struct ValueTextPair
{
public:
    ValueTextPair(int val, char *text)
    {
        m_Value = val;
        m_Text = text;
    }

    int m_Value;
    char *m_Text;

    ~ValueTextPair()
    {
        //std::cout << "Destroying ValueTextPair with value " << m_Value << std::endl;
    }
};

class MapStream
{
public:
    MapStream &operator<< (const ValueTextPair &aPair)
    {
        m_map.insert(PairMap::value_type(aPair.m_Value, aPair.m_Text));
   
        return *this;
    }

    void Dump()
    {
        for (PairMap::iterator iter = m_map.begin(); iter != m_map.end(); iter++)
        {
            //std::cout << "key is " << iter->first << " value is " << iter->second << std::endl;
        }
    }

    MapStream()
    {
        m_name = "Unknown";
    }

    MapStream(char *name)
    {
        // Debug only to see when they are destroyed
        m_name = name;
    }

    ~MapStream()
    {
        //std::cout << "Destroying the MapStream with the name " << m_name << "\n" << std::endl;
    }

    char *GetText(int valueId)
    {
        return m_map[valueId];
    }

private:
    //Debug only
    std::string m_name;

    typedef std::map<int, char *> PairMap;

    PairMap m_map;
};

class ConfigurableItem
{
public:
    ConfigurableItem(int objId, MapStream &mC) : m_ObjId(objId), m_mc(mC)
    {
    }

    int GetId()
    {
        return m_ObjId;
    }
   
    char *GetText(int valueId)
    {
        return m_mc.GetText(valueId);
    }
       
    void Dump()
    {
        m_mc.Dump();
    }
private:

    int m_ObjId;
    MapStream m_mc;
};

class Configuration
{
public:
    Configuration()
    {
    }
   
    ~Configuration()
    {
    }
   
    void AddItem(ConfigurableItem &item)
    {
        m_ciMap[item.GetId()] = &item;
    }
   
    char *FindName(int objId, int valueId)
    {
        ConfigurableItem *pItem = m_ciMap[objId];
       
        return pItem->GetText(valueId);
    }
   
private:
    typedef std::map<int, ConfigurableItem *> ConfigMap;

    ConfigMap m_ciMap;
       
};

enum ObjectIds
{
    eDAYS,
    eMONTHS,
    eSEASONS
};

int main(int argc, char *argv[])
{
    ConfigurableItem days(eDAYS, MapStream() <<
                          ValueTextPair(1, "Mon")  << ValueTextPair(2,  "Tue") <<
                          ValueTextPair(3, "Wed")  << ValueTextPair(4,  "Thu") <<
                          ValueTextPair(5, "Fri")  << ValueTextPair(6,  "Sat") <<
                          ValueTextPair(7, "Sun"));
                         
    ConfigurableItem months(eMONTHS, MapStream() <<
                            ValueTextPair(1, "Jan")  << ValueTextPair(2,  "Feb") <<
                            ValueTextPair(3, "Mar")  << ValueTextPair(4,  "Apr") <<
                            ValueTextPair(5, "May")  << ValueTextPair(6,  "Jun") <<
                            ValueTextPair(7, "Jul")  << ValueTextPair(8,  "Aug") <<
                            ValueTextPair(9, "Sep")  << ValueTextPair(10, "Oct") <<
                            ValueTextPair(11, "Nov") << ValueTextPair(12, "Nov"));
                           
                           
    ConfigurableItem seasons(eSEASONS, MapStream() <<
                          ValueTextPair(1, "Spring")  << ValueTextPair(2,  "Summer") <<
                          ValueTextPair(3, "Autumn")  << ValueTextPair(4,  "Winter"));
   
    Configuration config;
   
    config.AddItem(days);
    config.AddItem(months);
    config.AddItem(seasons);
   
    std::cout << "Day name with id 2 is " << config.FindName(eDAYS, 2) << "\n\n" ;
    std::cout << "Month name with id 2 is " << config.FindName(eMONTHS, 2) << "\n\n" ;
    std::cout << "Season name with id 2 is " << config.FindName(eSEASONS, 2) << "\n\n" ;
   
    return 0;
}

The output is

Day name with id 2 is Tue
Month name with id 2 is Feb
Season name with id 2 is Summer