00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __UT_TagManager__
00034 #define __UT_TagManager__
00035
00036 #include "UT_API.h"
00037 #include "UT_SymbolTable.h"
00038 #include "UT_SmallObject.h"
00039 #include "UT_String.h"
00040 #include "UT_PtrArray.h"
00041 #include <SYS/SYS_AtomicInt.h>
00042
00043 class UT_StringArray;
00044 class UT_TagManager;
00045 class UT_TagList;
00046 class UT_TagExpression;
00047 class ut_TagName;
00048 class ut_TagList;
00049 class ut_TagExpression;
00050
00051 class UT_API UT_TagList
00052 : public UT_SmallObject<UT_TagList,
00053 UT_SMALLOBJECT_CLEANPAGES_ON,
00054 512,
00055 UT_SMALLOBJECT_THREADSAFE_ON>
00056 {
00057 public:
00058 UT_TagList(UT_TagManager &manager, ut_TagList *list)
00059 : myManager(manager), myList(list) { }
00060 ~UT_TagList();
00061
00062 void getListString(UT_WorkBuffer &buffer) const;
00063 bool match(const UT_TagExpression &pattern) const;
00064 uint hash() const;
00065 bool compare(const UT_TagList &list) const;
00066
00067 private:
00068 UT_TagManager &myManager;
00069 ut_TagList *myList;
00070 friend class UT_TagManager;
00071 };
00072
00073 class UT_API UT_TagExpression
00074 : public UT_SmallObject<UT_TagExpression,
00075 UT_SMALLOBJECT_CLEANPAGES_ON,
00076 512,
00077 UT_SMALLOBJECT_THREADSAFE_ON>
00078 {
00079 public:
00080 UT_TagExpression(UT_TagManager &manager, ut_TagExpression *pattern)
00081 : myManager(manager), myExpression(pattern) { }
00082 ~UT_TagExpression();
00083
00084 void getExpressionString(UT_WorkBuffer &buffer) const;
00085 bool match(const UT_TagList &list) const;
00086 bool isTautology() const;
00087
00088 private:
00089 UT_TagManager &myManager;
00090 ut_TagExpression *myExpression;
00091 friend class UT_TagManager;
00092 };
00093
00094 class UT_API UT_TagManager {
00095 public:
00096 UT_TagManager(const char *name);
00097 ~UT_TagManager();
00098
00099
00100
00101
00102 UT_TagList *createTagList(const char *list, UT_String &errs);
00103 UT_TagList *copyTagList(const UT_TagList &src);
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 UT_TagExpression *createTagExpression(const char *expression, UT_String &errs);
00129
00130
00131
00132 void getAllNames(UT_StringArray &tags, bool listref=true);
00133
00134
00135 bool match(const UT_TagExpression &pattern, const UT_TagList &list);
00136
00137
00138 bool isTautology(const ut_TagExpression *expr) const;
00139
00140
00141 int getMemUsage() const;
00142
00143 private:
00144
00145 void freeList(ut_TagList *list);
00146 void freeExpression(ut_TagExpression *pattern);
00147
00148 void makeListString(UT_WorkBuffer &buf,
00149 const ut_TagList *list);
00150 void makeExpressionString(UT_WorkBuffer &buf,
00151 const ut_TagExpression *pattern);
00152 ut_TagName *getTag(const char *tag);
00153
00154 UT_String myName;
00155 UT_SymbolTable myNameTable;
00156 UT_PtrArray<ut_TagName *> myNameList;
00157 int64 myMemUsage;
00158 SYS_AtomicInt32 myListCount;
00159 SYS_AtomicInt32 myExpressionCount;
00160
00161 friend class UT_TagList;
00162 friend class UT_TagExpression;
00163 };
00164
00165 #endif