00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __UT_FSASymbolTable__
00022 #define __UT_FSASymbolTable__
00023
00024 #include "UT_API.h"
00025 #include "UT_FSA.h"
00026 #include "UT_SmallObject.h"
00027 #include "UT_Thing.h"
00028 #include "UT_PtrArray.h"
00029
00030 class ut_FSASymbolStorage;
00031 class ut_FSASymbolStorage
00032 : public UT_SmallObject<ut_FSASymbolStorage,
00033 UT_SMALLOBJECT_CLEANPAGES_ON,
00034 1024,
00035 UT_SMALLOBJECT_THREADSAFE_ON>
00036 {
00037 public:
00038 UT_Thing myThing;
00039 char *myString;
00040 };
00041
00042 class UT_API UT_FSASymbolTable {
00043 public:
00044 UT_FSASymbolTable();
00045 ~UT_FSASymbolTable();
00046
00047 void addSymbol(const char *symbol, UT_Thing data);
00048 int deleteSymbol(const char *symbol);
00049 void clear();
00050
00051 int findSymbol(const char *symbol, UT_Thing *datap) const
00052 {
00053 int idx;
00054 if (myDirty) rebuild();
00055 idx = myTable.findSymbol(symbol);
00056 if (idx >= 0)
00057 {
00058 *datap = myStorage(idx)->myThing;
00059 return 1;
00060 }
00061 return 0;
00062 }
00063
00064 unsigned entries() const { return myStorage.entries(); }
00065 bool empty() const { return !myStorage.entries(); }
00066
00067 const char *getStringReference(const char *symbol)
00068 {
00069 int idx;
00070 if (myDirty) rebuild();
00071 idx = myTable.findSymbol(symbol);
00072 return idx >= 0 ? myStorage(idx)->myString : 0;
00073 }
00074
00075 int64 getMemUsage(bool =false) const
00076 {
00077 if (myDirty) rebuild();
00078 return sizeof(*this) + myTable.getMemUsage()
00079 + myStorage.getMemoryUsage();
00080 }
00081
00082 int traverseConst(
00083 int (*function)(UT_Thing &, const char *, void *),
00084 void *data) const
00085 {
00086 int i;
00087 for (i = 0; i < myStorage.entries(); i++)
00088 {
00089 if (!function(myStorage(i)->myThing,
00090 myStorage(i)->myString, data))
00091 return 0;
00092 }
00093 return 1;
00094 }
00095 int traverse(int (*function)(UT_Thing &, const char *, void *),
00096 void *data)
00097 {
00098 int i;
00099 for (i = 0; i < myStorage.entries(); i++)
00100 {
00101 if (!function(myStorage(i)->myThing,
00102 myStorage(i)->myString, data))
00103 return 0;
00104 }
00105 return 1;
00106 }
00107
00108 void rebuild();
00109
00110 private:
00111 void rebuild() const;
00112
00113 UT_FSA myTable;
00114 UT_PtrArray<ut_FSASymbolStorage *> myStorage;
00115 bool myDirty;
00116 };
00117
00118 #endif
00119