| 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
 |