00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __UT_PtrArraySorted_h__
00015 #define __UT_PtrArraySorted_h__
00016
00017 #include "UT_PtrArray.h"
00018
00019 template <class utPtr>
00020 class UT_PtrArraySorted
00021 {
00022 public:
00023 UT_PtrArraySorted()
00024 : myComparator(
00025 typename UT_PtrArray<utPtr>::Comparator(
00026 UTcomparePointers))
00027 { }
00028
00029 UT_PtrArraySorted(
00030 typename UT_PtrArray<utPtr>::Comparator comparator)
00031 : myComparator(comparator)
00032 { }
00033 virtual ~UT_PtrArraySorted()
00034 { }
00035
00036 void setComparator(typename
00037 UT_PtrArray<utPtr>::Comparator cmp)
00038 { myComparator = cmp; myArray.sort(myComparator); }
00039 void sort()
00040 { myArray.sort(myComparator); }
00041
00042 int entries() const
00043 { return myArray.entries(); }
00044 void entries(int newnumentries)
00045 { myArray.entries(newnumentries); }
00046 void resize(int newsize)
00047 { myArray.resize(newsize); }
00048
00049 utPtr operator()(int index) const
00050 { return myArray(index); }
00051 utPtr last() const
00052 { return myArray.last(); }
00053 int find(utPtr ptr) const
00054 { return myArray.find(ptr, myComparator); }
00055
00056 int findString(const char *str) const
00057 { return myArray.findString(str); }
00058
00059 bool operator==(const UT_PtrArraySorted &cmp) const
00060 {
00061 utPtr ptr, cmpptr;
00062 int idx, num, diff;
00063
00064 if( entries() != cmp.entries() )
00065 return false;
00066
00067 num = entries();
00068 for( idx = 0; idx < num; idx++ )
00069 {
00070 ptr = myArray(idx);
00071 cmpptr = cmp.myArray(idx);
00072 diff = myComparator(&ptr, &cmpptr);
00073
00074 if( diff != 0 )
00075 return false;
00076 }
00077
00078 return true;
00079 }
00080
00081 bool containsAny(const UT_PtrArraySorted &cmp) const
00082 {
00083 utPtr ptr, cmpptr;
00084 int idx, cmpidx, num, numcmp, diff;
00085
00086 numcmp = cmp.entries();
00087 num = entries();
00088 for( idx = 0, cmpidx = 0;
00089 idx < num && cmpidx < numcmp; )
00090 {
00091 ptr = myArray(idx);
00092 cmpptr = cmp.myArray(cmpidx);
00093 diff = myComparator(&ptr, &cmpptr);
00094
00095 if( diff < 0 )
00096 {
00097 idx++;
00098 }
00099 else if( diff > 0 )
00100 {
00101 cmpidx++;
00102 }
00103 else
00104 {
00105 return true;
00106 }
00107 }
00108
00109 return false;
00110 }
00111 bool containsFully(const UT_PtrArraySorted &cmp) const
00112 {
00113 utPtr ptr, cmpptr;
00114 int idx, cmpidx, num, numcmp, diff;
00115
00116 numcmp = cmp.entries();
00117 num = entries();
00118 for( idx = 0, cmpidx = 0;
00119 idx < num && cmpidx < numcmp; )
00120 {
00121 ptr = myArray(idx);
00122 cmpptr = cmp.myArray(cmpidx);
00123 diff = myComparator(&ptr, &cmpptr);
00124
00125 if( diff < 0 )
00126 {
00127 idx++;
00128 }
00129 else if( diff > 0 )
00130 {
00131 return false;
00132 }
00133 else
00134 {
00135 idx++;
00136 cmpidx++;
00137 }
00138 }
00139
00140 return (cmpidx >= numcmp) ? true : false;
00141 }
00142
00143 void remove(int index)
00144 { myArray.removeIndex(index); }
00145 void remove(utPtr ptr)
00146 { int pos = find(ptr); if( pos >= 0 ) remove(pos); }
00147 void remove(const UT_PtrArraySorted &src)
00148 {
00149 utPtr srcptr, destptr;
00150 int idx, srcidx, diff, numsrc;
00151 bool removed = false;
00152
00153 numsrc = src.entries();
00154 for( idx = 0, srcidx = 0;
00155 srcidx < numsrc && idx < entries(); )
00156 {
00157 destptr = myArray(idx);
00158 srcptr = src.myArray(srcidx);
00159 diff = myComparator(&destptr, &srcptr);
00160
00161 if( diff < 0 )
00162 {
00163 idx++;
00164 }
00165 else
00166 {
00167 if( diff == 0 )
00168 {
00169 myArray(idx) = 0;
00170 removed = true;
00171 idx++;
00172 }
00173 srcidx++;
00174 }
00175 }
00176 if( removed )
00177 myArray.removeZeros();
00178 }
00179 void keepOnly(const UT_PtrArraySorted &src)
00180 {
00181 utPtr srcptr, destptr;
00182 int idx, srcidx, diff, numsrc;
00183 bool removed = false;
00184
00185 numsrc = src.entries();
00186 for( idx = 0, srcidx = 0; idx < entries(); )
00187 {
00188 if( srcidx < numsrc )
00189 {
00190 destptr = myArray(idx);
00191 srcptr = src.myArray(srcidx);
00192 diff = myComparator(&destptr, &srcptr);
00193 }
00194 else
00195 diff = -1;
00196
00197 if( diff < 0 )
00198 {
00199 myArray(idx) = 0;
00200 removed = true;
00201 idx++;
00202 }
00203 else
00204 {
00205 if( diff == 0 )
00206 idx++;
00207 srcidx++;
00208 }
00209 }
00210 if( removed )
00211 myArray.removeZeros();
00212 }
00213
00214 const UT_PtrArraySorted &operator=(const UT_PtrArraySorted &src)
00215 { set(src); return *this; }
00216 int add(utPtr ptr)
00217 {
00218 return myArray.
00219 uniqueSortedInsert(ptr, myComparator);
00220 }
00221 void set(const UT_PtrArraySorted &src)
00222 {
00223 myComparator = src.myComparator;
00224 myArray = src.myArray;
00225 }
00226 void setUnsorted(const UT_PtrArray<utPtr> &src,
00227 UT_PtrArraySorted &duplicates)
00228 {
00229 utPtr lastptr, nextptr;
00230 int idx;
00231
00232 myArray = src;
00233 sort();
00234 for( idx = 1; idx < entries(); idx++ )
00235 {
00236 lastptr = myArray(idx-1);
00237 nextptr = myArray(idx);
00238 if( myComparator(&lastptr, &nextptr) == 0 )
00239 {
00240 duplicates.add(lastptr);
00241 myArray(idx-1) = 0;
00242 }
00243 }
00244 if( duplicates.entries() )
00245 myArray.removeZeros();
00246 }
00247 void merge(const UT_PtrArraySorted &src)
00248 {
00249 utPtr srcptr, destptr;
00250 int idx, srcidx, diff, numsrc;
00251
00252 numsrc = src.entries();
00253 for( idx = 0, srcidx = 0; srcidx < numsrc; )
00254 {
00255 if( idx < entries() )
00256 {
00257 destptr = myArray(idx);
00258 srcptr = src.myArray(srcidx);
00259 diff = myComparator(&destptr, &srcptr);
00260 }
00261 else
00262 diff = 1;
00263 if( diff < 0 )
00264 {
00265 idx++;
00266 }
00267 else
00268 {
00269 if( diff > 0 )
00270 myArray.insert(src(srcidx), idx);
00271 idx++;
00272 srcidx++;
00273 }
00274 }
00275 }
00276 void mergeSelected(const UT_PtrArraySorted &src,
00277 bool (*selectfunc)(utPtr))
00278 {
00279 utPtr srcptr, destptr;
00280 int idx, srcidx, diff, numsrc;
00281
00282 numsrc = src.entries();
00283 for( idx = 0, srcidx = 0; srcidx < numsrc; )
00284 {
00285
00286
00287 if( selectfunc(src.myArray(srcidx)) )
00288 {
00289 if( idx < entries() )
00290 {
00291 destptr = myArray(idx);
00292 srcptr = src.myArray(srcidx);
00293 diff = myComparator(&destptr, &srcptr);
00294 }
00295 else
00296 diff = 1;
00297 if( diff < 0 )
00298 {
00299 idx++;
00300 }
00301 else
00302 {
00303 if( diff > 0 )
00304 myArray.insert(src(srcidx), idx);
00305 idx++;
00306 srcidx++;
00307 }
00308 }
00309 else
00310 srcidx++;
00311 }
00312 }
00313
00314
00315
00316 void appendUnsafe(utPtr ptr)
00317 { myArray.append(ptr); }
00318
00319 const UT_PtrArray<utPtr> &getRawArray() const
00320 { return myArray; }
00321
00322 UT_PtrArray<utPtr> &getRawArray()
00323 { return myArray; }
00324
00325 private:
00326 typename UT_PtrArray<utPtr>::Comparator myComparator;
00327 UT_PtrArray<utPtr> myArray;
00328 };
00329
00330
00331 #endif
00332