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