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
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef StaticHashTable_H
00043 #define StaticHashTable_H
00044
00045 #include <OpenFOAM/label.H>
00046 #include <OpenFOAM/uLabel.H>
00047 #include <OpenFOAM/word.H>
00048 #include <OpenFOAM/Xfer.H>
00049 #include <OpenFOAM/className.H>
00050
00051
00052
00053 namespace Foam
00054 {
00055
00056
00057
00058 template<class T> class List;
00059 template<class T, class Key, class Hash> class StaticHashTable;
00060
00061 template<class T, class Key, class Hash> Istream& operator>>
00062 (
00063 Istream&,
00064 StaticHashTable<T, Key, Hash>&
00065 );
00066
00067 template<class T, class Key, class Hash> Ostream& operator<<
00068 (
00069 Ostream&,
00070 const StaticHashTable<T, Key, Hash>&
00071 );
00072
00073
00074
00075
00076
00077
00078 TemplateName(StaticHashTable);
00079
00080
00081
00082
00083
00084
00085 template<class T, class Key=word, class Hash=string::hash>
00086 class StaticHashTable
00087 :
00088 public StaticHashTableName
00089 {
00090
00091
00092
00093 List<List<Key> > keys_;
00094
00095
00096 List<List<T> > objects_;
00097
00098
00099 label nElmts_;
00100
00101
00102 static label canonicalSize(const label);
00103
00104
00105
00106 inline label hashKeyIndex(const Key&) const;
00107
00108
00109 bool set(const Key&, const T& newElmt, bool protect);
00110
00111 public:
00112
00113
00114
00115
00116 template<class TRef, class TableRef>
00117 class Iterator;
00118
00119 typedef Iterator
00120 <
00121 T&,
00122 StaticHashTable<T, Key, Hash>&
00123 > iterator;
00124
00125 typedef Iterator
00126 <
00127 const T&,
00128 const StaticHashTable<T, Key, Hash>&
00129 > const_iterator;
00130
00131
00132
00133
00134 friend class Iterator
00135 <
00136 T&,
00137 StaticHashTable<T, Key, Hash>&
00138 >;
00139
00140 friend class Iterator
00141 <
00142 const T&,
00143 const StaticHashTable<T, Key, Hash>&
00144 >;
00145
00146
00147
00148
00149
00150 StaticHashTable(const label size = 128);
00151
00152
00153 StaticHashTable(Istream&, const label size = 128);
00154
00155
00156 StaticHashTable(const StaticHashTable<T, Key, Hash>&);
00157
00158
00159 StaticHashTable(const Xfer< StaticHashTable<T, Key, Hash> >&);
00160
00161
00162
00163 ~StaticHashTable();
00164
00165
00166
00167
00168
00169
00170
00171 inline label size() const;
00172
00173
00174 inline bool empty() const;
00175
00176
00177 bool found(const Key& key) const;
00178
00179
00180
00181 iterator find(const Key& key);
00182
00183
00184
00185 const_iterator find(const Key& key) const;
00186
00187
00188 List<Key> toc() const;
00189
00190
00191 Ostream& printInfo(Ostream&) const;
00192
00193
00194
00195
00196
00197 bool insert(const Key& key, const T& newElmt);
00198
00199
00200 inline bool set(const Key&, const T& newElmt);
00201
00202
00203 bool erase(const iterator& it);
00204
00205
00206 bool erase(const Key& key);
00207
00208
00209 void resize(const label newSize);
00210
00211
00212
00213 label erase(const StaticHashTable<T, Key, Hash>&);
00214
00215
00216 void clear();
00217
00218
00219
00220 void clearStorage();
00221
00222
00223
00224 void transfer(StaticHashTable<T, Key, Hash>&);
00225
00226
00227 inline Xfer< StaticHashTable<T, Key, Hash> > xfer();
00228
00229
00230
00231
00232
00233 inline T& operator[](const Key&);
00234
00235
00236 inline const T& operator[](const Key&) const;
00237
00238
00239 inline T& operator()(const Key&);
00240
00241
00242 void operator=(const StaticHashTable<T, Key, Hash>&);
00243
00244
00245
00246 bool operator==(const StaticHashTable<T, Key, Hash>&) const;
00247
00248
00249 bool operator!=(const StaticHashTable<T, Key, Hash>&) const;
00250
00251
00252
00253
00254 typedef T value_type;
00255
00256
00257
00258 typedef T& reference;
00259
00260
00261
00262
00263 typedef const T& const_reference;
00264
00265
00266 typedef label size_type;
00267
00268
00269
00270
00271
00272 template<class TRef, class TableRef>
00273 class Iterator
00274 {
00275 friend class StaticHashTable;
00276
00277 # ifndef __INTEL_COMPILER
00278 template<class TRef2, class TableRef2>
00279 friend class Iterator;
00280 # endif
00281
00282
00283
00284
00285 TableRef hashTable_;
00286
00287
00288 label hashIndex_;
00289
00290
00291 label elemIndex_;
00292
00293 public:
00294
00295
00296
00297
00298 inline Iterator
00299 (
00300 TableRef,
00301 label hashIndex_,
00302 label elemIndex_
00303 );
00304
00305
00306 inline Iterator(const iterator&);
00307
00308
00309
00310
00311 inline void operator=(const iterator&);
00312
00313 inline bool operator==(const iterator&) const;
00314 inline bool operator==(const const_iterator&) const;
00315
00316 inline bool operator!=(const iterator&) const;
00317 inline bool operator!=(const const_iterator&) const;
00318
00319 inline TRef operator*();
00320 inline TRef operator()();
00321
00322 inline Iterator& operator++();
00323 inline Iterator operator++(int);
00324
00325 inline const Key& key() const;
00326 };
00327
00328
00329
00330 inline iterator begin();
00331
00332
00333 inline const iterator& end();
00334
00335
00336 inline const_iterator cbegin() const;
00337
00338
00339 inline const const_iterator& cend() const;
00340
00341
00342 inline const_iterator begin() const;
00343
00344
00345 inline const const_iterator& end() const;
00346
00347
00348
00349 friend Istream& operator>> <T, Key, Hash>
00350 (
00351 Istream&,
00352 StaticHashTable<T, Key, Hash>&
00353 );
00354
00355 friend Ostream& operator<< <T, Key, Hash>
00356 (
00357 Ostream&,
00358 const StaticHashTable<T, Key, Hash>&
00359 );
00360
00361
00362 private:
00363
00364
00365 iterator endIter_;
00366
00367
00368 const_iterator endConstIter_;
00369 };
00370
00371
00372
00373
00374 }
00375
00376
00377
00378 # include "StaticHashTableI.H"
00379
00380
00381
00382 #ifndef NoStaticHashTableC
00383 #ifdef NoRepository
00384 # include "StaticHashTable.C"
00385 #endif
00386 #endif
00387
00388
00389
00390 #endif
00391
00392