123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #ifndef __STRINGDICT_H
- #define __STRINGDICT_H
- #include <bfc/string/StringW.h>
- #include <bfc/ptrlist.h>
- // 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<StringDictionaryItem, StringDictionaryItemCompare> 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
|