#ifndef DATACONTAINER_H #define DATACONTAINER_H /* * Usage: * 1) Define your data containers * BeginDataContainersDefinition(containerType); * DefineDataContainerFor (int, Int); * DefineDataContainerFor (double, Double); * DefineDataContainerFor (some::Ugly::Namespaced::MyClass, MyClass); * EndDataContainersDefinition; * * 2) Instantiate a data container * NewDataContainer(containerType, myDC); * * 3) Add data * myDC->SetInt("an int variable", 2); * myDC->SetMyClass("this is my class", some::Ugly::Namespaced::MyClass()); * * 4) Get data * int my_int = myDC->GetInt("an int variable"); * * 5) Check whether data has been set already [runs in O(n) , n := number of data] * bool isMyClassSet = myDC->IsSetMyClass("this is my class"); * * 6) Iterate data * for (myDC->IntIteratorInit(); myDC->IntIteratorHasNext(); myDC->IntIteratorNext()) { * const char *key = myDC->IntIteratorGetKey(); * int value = myDC->IntIteratorGetValue(); * } * * 8) Clean up * FreeDataContainer(myDC); */ #include #define BeginDataContainersDefinition(containerType) \ class DataContainer##containerType { \ public: \ DataContainer##containerType() {}; \ private: \ bool dummySemiColonHere #define EndDataContainersDefinition } #define DefineDataContainerFor(type, typeName) \ private: \ std::map all##typeName##s; \ std::map::iterator typeName##iter; \ public: \ type Get##typeName (const char *s) { return all##typeName##s[s]; } \ void Set##typeName (const char *s, type t) { all##typeName##s[s] = t; } \ bool IsSet##typeName (const char *s) { return (all##typeName##s.find(s) != all##typeName##s.end()); } \ void typeName##IteratorInit(void) { typeName##iter = all##typeName##s.begin(); } \ bool typeName##IteratorHasNext(void) { return (typeName##iter != all##typeName##s.end()); } \ void typeName##IteratorNext(void) { ++typeName##iter; } \ const char *typeName##IteratorGetKey(void) { return ((*typeName##iter).first); } \ type typeName##IteratorGetValue(void) { return ((*typeName##iter).second); } \ char dummySemiColonHere##typeName #define NewDataContainer(containerType, name) \ DataContainer##containerType *name = new DataContainer##containerType() #define FreeDataContainer(name) \ delete name #endif /* !DATACONTAINER_H */