#ifndef __STRINGDICT_H #define __STRINGDICT_H #include #include // a convenient class to statically declare strings and their IDs with binary search lookups // // example of use : // // BEGIN_STRINGDICTIONARY(_identifier) // SDI("somestring", 0); // SDI("someotherstring", 1); // SDI("andyetanotherstring", 2); // END_STRINGDICTIONARY(_identifier, identifier) // foo (const char *str) { // int a = identifier.getId(str); // if (a < 0) { // // not found! // } // return a; // } class StringDictionaryItem { public: StringDictionaryItem(const wchar_t *string, int stringid) : str(string), id(stringid) {} virtual ~StringDictionaryItem() {} const wchar_t *getString() { return str; } int getId() { return id; } private: StringW str; int id; }; class StringDictionaryItemCompare { public: static int compareItem(void *p1, void *p2) { return WCSICMP(((StringDictionaryItem *)p1)->getString(), ((StringDictionaryItem *)p2)->getString()); } static int compareAttrib(const wchar_t *attrib, void *item) { return WCSICMP(attrib, ((StringDictionaryItem *)item)->getString()); } }; class StringDictionary { public: StringDictionary() {} virtual ~StringDictionary() { items.deleteAll(); } virtual void addItem(const wchar_t *str, int id) { ASSERT(id != -1); items.addItem(new StringDictionaryItem(str, id)); } virtual int getId(const wchar_t *str) { StringDictionaryItem *i = items.findItem(str); if (i == NULL) return -1; return i->getId(); } private: PtrListQuickSorted items; }; #define BEGIN_STRINGDICTIONARY(class_ident) \ class class_ident : public StringDictionary { \ public: \ class_ident() { #define SDI(str, id) \ addItem(str, id); #define END_STRINGDICTIONARY(class_ident, instance_ident) \ }; \ virtual ~class_ident() { } \ }; \ \ class_ident instance_ident; #endif