From 2aeee852e82a611d4f35c7584980b4ff90c64910 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 26 Feb 2009 15:32:47 +0100 Subject: [PATCH] PackedList bugfix, HashTable tweak - it was possible to create a PackedList::iterator from a PackedList::const_iterator and violate const-ness - added HashTable::printInfo for emitting some information - changed default table sizes from 100 -> 128 in preparation for future 2^n table sizes --- applications/test/FixedList/FixedListTest.C | 28 ++++++++----- .../test/PackedList2/PackedListTest2.C | 29 +++++++++++++- applications/test/string/stringTest.C | 7 +++- .../HashTables/HashPtrTable/HashPtrTable.H | 2 +- .../containers/HashTables/HashSet/HashSet.H | 2 +- .../HashTables/HashTable/HashTable.H | 6 ++- .../HashTables/HashTable/HashTableIO.C | 39 +++++++++++++++++++ src/OpenFOAM/containers/HashTables/Map/Map.H | 2 +- .../containers/HashTables/PtrMap/PtrMap.H | 2 +- .../StaticHashTable/StaticHashTable.H | 7 +++- .../StaticHashTable/StaticHashTableIO.C | 35 +++++++++++++++++ .../containers/Lists/FixedList/FixedListI.H | 7 ++-- .../containers/Lists/PackedList/PackedList.H | 9 ++++- src/OpenFOAM/db/IOobjectList/IOobjectList.H | 2 +- .../db/objectRegistry/objectRegistry.H | 6 +-- src/OpenFOAM/meshes/meshShapes/edge/EdgeMap.H | 2 +- .../primitives/strings/string/stringI.H | 8 ++-- 17 files changed, 159 insertions(+), 34 deletions(-) diff --git a/applications/test/FixedList/FixedListTest.C b/applications/test/FixedList/FixedListTest.C index a5e3341b65..d82f077eae 100644 --- a/applications/test/FixedList/FixedListTest.C +++ b/applications/test/FixedList/FixedListTest.C @@ -52,16 +52,18 @@ int main(int argc, char *argv[]) list[1] = 2; list[2] = 3; list[3] = 4; - Info<< list << endl; + + Info<< "list:" << list + << " hash:" << FixedList::Hash<>()(list) << endl; label a[4] = {0, 1, 2, 3}; FixedList list2(a); - Info<< list2 << endl; - Info<< FixedList::Hash<>()(list2) << endl; + Info<< "list:" << list2 + << " hash:" << FixedList::Hash<>()(list2) << endl; - //FixedList hmm(Sin); - //Info<< hmm << endl; + // FixedList hmm(Sin); + // Info<< hmm << endl; if (Pstream::parRun()) { @@ -69,7 +71,12 @@ int main(int argc, char *argv[]) { Serr<< "slave sending to master " << Pstream::masterNo() << endl; - OPstream toMaster(Pstream::masterNo(), IOstream::ASCII); + + OPstream toMaster + ( + Pstream::blocking, Pstream::masterNo(), IOstream::ASCII + ); + FixedList list3; list3[0] = 0; list3[1] = 1; @@ -79,13 +86,16 @@ int main(int argc, char *argv[]) { for ( - int slave=Pstream::firstSlave(); - slave<=Pstream::lastSlave(); + int slave = Pstream::firstSlave(); + slave <= Pstream::lastSlave(); slave++ ) { Serr << "master receiving from slave " << slave << endl; - IPstream fromSlave(slave, IOstream::ASCII); + IPstream fromSlave + ( + Pstream::blocking, slave, IOstream::ASCII + ); FixedList list3(fromSlave); Serr<< list3 << endl; diff --git a/applications/test/PackedList2/PackedListTest2.C b/applications/test/PackedList2/PackedListTest2.C index 78f0f9f914..ef027fee2e 100644 --- a/applications/test/PackedList2/PackedListTest2.C +++ b/applications/test/PackedList2/PackedListTest2.C @@ -61,8 +61,20 @@ int main(int argc, char *argv[]) fullHash.insert(i); } - // don't use fullStaticHash, it's too slow + // fullStaticHash is really slow + // give it lots of slots to help StaticHashTable > emptyStaticHash; + StaticHashTable > fullStaticHash(100000); + for (label i = 0; i < n; i++) + { + fullStaticHash.insert(i, nil()); + } + + emptyHash.printInfo(Info); + fullHash.printInfo(Info); + emptyStaticHash.printInfo(Info); + fullStaticHash.printInfo(Info); + cpuTime timer; @@ -252,6 +264,21 @@ int main(int argc, char *argv[]) << " s" << endl; Info<< " sum " << sum << endl; +#if 0 + // we can skip this test - it is usually quite slow + // Read full static hash + sum = 0; + for (label iter = 0; iter < nIters; ++iter) + { + forAll(unpacked, i) + { + sum += fullStaticHash.found(i); + } + } + Info<< "Reading full StaticHash:" << timer.cpuTimeIncrement() + << " s" << endl; + Info<< " sum " << sum << endl; +#endif Info<< "Starting write tests" << endl; diff --git a/applications/test/string/stringTest.C b/applications/test/string/stringTest.C index 7981356760..b8442102f3 100644 --- a/applications/test/string/stringTest.C +++ b/applications/test/string/stringTest.C @@ -38,10 +38,11 @@ int main(int argc, char *argv[]) { string test("$HOME kjhkjhkjh \" \\$HOME/tyetyery ${FOAM_RUN} \n ; hkjh ;$"); - Info<< test << endl; + Info<< "string:" << test << nl << "hash:" + << unsigned(string::hash()(test)) << endl; // test sub-strings via iterators - string::const_iterator iter = test.end(); + string::const_iterator iter = test.end(); string::const_iterator iter2 = test.end(); string::size_type fnd = test.find('\\'); @@ -77,6 +78,8 @@ int main(int argc, char *argv[]) cout<< "output string with " << s2.length() << " characters\n"; cout<< "ostream<< >" << s2 << "<\n"; Info<< "Ostream<< >" << s2 << "<\n"; + Info<< "hash:" << unsigned(string::hash()(s2)) << endl; + Info << "End\n" << endl; diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H index ee1c7ba7cc..8ae3697f1d 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H @@ -83,7 +83,7 @@ public: // Constructors //- Construct given initial table size - HashPtrTable(const label size = 100); + HashPtrTable(const label size = 128); //- Construct from Istream using given Istream constructor class template diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H index 9a4c5951be..6353818d7e 100644 --- a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H +++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H @@ -72,7 +72,7 @@ public: // Constructors //- Construct given initial size - HashSet(const label size = 100) + HashSet(const label size = 128) : HashTable(size) {} diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H index 457e2f1b7e..65a5635e16 100644 --- a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H +++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H @@ -142,10 +142,10 @@ public: // Constructors //- Construct given initial table size - HashTable(const label size = 100); + HashTable(const label size = 128); //- Construct from Istream - HashTable(Istream&, const label size = 100); + HashTable(Istream&, const label size = 128); //- Construct as copy HashTable(const HashTable&); @@ -183,6 +183,8 @@ public: //- Return the table of contents List toc() const; + //- Print information + Ostream& printInfo(Ostream&) const; // Edit diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTableIO.C b/src/OpenFOAM/containers/HashTables/HashTable/HashTableIO.C index 4daab805c0..1525d1d72e 100644 --- a/src/OpenFOAM/containers/HashTables/HashTable/HashTableIO.C +++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTableIO.C @@ -48,6 +48,45 @@ Foam::HashTable::HashTable(Istream& is, const label size) } +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template +Foam::Ostream& +Foam::HashTable::printInfo(Ostream& os) const +{ + label used = 0; + label maxChain = 0; + unsigned avgChain = 0; + + for (label hashIdx = 0; hashIdx < tableSize_; ++hashIdx) + { + label count = 0; + for (hashedEntry* ep = table_[hashIdx]; ep; ep = ep->next_) + { + ++count; + } + + if (count) + { + ++used; + avgChain += count; + + if (maxChain < count) + { + maxChain = count; + } + } + } + + os << "HashTable" + << " elements:" << size() << " slots:" << used << "/" << tableSize_ + << " chaining(avg/max):" << (used ? float(avgChain/used) : 0) + << "/" << maxChain << endl; + + return os; +} + + // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // template diff --git a/src/OpenFOAM/containers/HashTables/Map/Map.H b/src/OpenFOAM/containers/HashTables/Map/Map.H index e43283412d..e84e96899a 100644 --- a/src/OpenFOAM/containers/HashTables/Map/Map.H +++ b/src/OpenFOAM/containers/HashTables/Map/Map.H @@ -63,7 +63,7 @@ public: // Constructors //- Construct given initial size - Map(const label size = 100) + Map(const label size = 128) : HashTable >(size) {} diff --git a/src/OpenFOAM/containers/HashTables/PtrMap/PtrMap.H b/src/OpenFOAM/containers/HashTables/PtrMap/PtrMap.H index cab0cf17ff..5d0b92b6de 100644 --- a/src/OpenFOAM/containers/HashTables/PtrMap/PtrMap.H +++ b/src/OpenFOAM/containers/HashTables/PtrMap/PtrMap.H @@ -58,7 +58,7 @@ public: // Constructors //- Construct given initial map size - PtrMap(const label size = 100) + PtrMap(const label size = 128) : HashPtrTable >(size) {} diff --git a/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTable.H b/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTable.H index 4513ea0245..60ed0e6fbb 100644 --- a/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTable.H +++ b/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTable.H @@ -141,10 +141,10 @@ public: // Constructors //- Construct given initial table size - StaticHashTable(const label size = 100); + StaticHashTable(const label size = 128); //- Construct from Istream - StaticHashTable(Istream&, const label size = 100); + StaticHashTable(Istream&, const label size = 128); //- Construct as copy StaticHashTable(const StaticHashTable&); @@ -181,6 +181,9 @@ public: //- Return the table of contents List toc() const; + //- Print information + Ostream& printInfo(Ostream&) const; + // Edit diff --git a/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTableIO.C b/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTableIO.C index 766ccc9d64..3939851fc5 100644 --- a/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTableIO.C +++ b/src/OpenFOAM/containers/HashTables/StaticHashTable/StaticHashTableIO.C @@ -57,6 +57,41 @@ Foam::StaticHashTable::StaticHashTable } +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template +Foam::Ostream& +Foam::StaticHashTable::printInfo(Ostream& os) const +{ + label used = 0; + label maxChain = 0; + unsigned avgChain = 0; + + // Find first non-empty entry + forAll(keys_, hashIdx) + { + const label count = keys_[hashIdx].size(); + if (count) + { + ++used; + avgChain += count; + + if (maxChain < count) + { + maxChain = count; + } + } + } + + os << "StaticHashTable" + << " elements:" << size() << " slots:" << used << "/" << keys_.size() + << " chaining(avg/max):" << (used ? float(avgChain/used) : 0) + << "/" << maxChain << endl; + + return os; +} + + // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // template diff --git a/src/OpenFOAM/containers/Lists/FixedList/FixedListI.H b/src/OpenFOAM/containers/Lists/FixedList/FixedListI.H index a800b04b1d..4820ecc7f9 100644 --- a/src/OpenFOAM/containers/Lists/FixedList/FixedListI.H +++ b/src/OpenFOAM/containers/Lists/FixedList/FixedListI.H @@ -408,7 +408,8 @@ template inline Foam::FixedList::Hash::Hash() {} -//- Rotating Hash. From http://burtleburtle.net/bob/hash/doobs.html + +// Rotating Hash template template inline Foam::label Foam::FixedList::Hash::operator() @@ -422,7 +423,7 @@ inline Foam::label Foam::FixedList::Hash::operator() for (register int i=0; i>farbit)^HashT()(lst[i]); + val = (val << 4) ^ (val >> farbit) ^ HashT()(lst[i]); } return val; @@ -436,7 +437,7 @@ inline Foam::label Foam::FixedList::Hash::operator() const label tableSize ) const { - return mag(operator()(lst)) % tableSize; + return ::abs(operator()(lst)) % tableSize; } #endif diff --git a/src/OpenFOAM/containers/Lists/PackedList/PackedList.H b/src/OpenFOAM/containers/Lists/PackedList/PackedList.H index 5f71976aa9..182c469b41 100644 --- a/src/OpenFOAM/containers/Lists/PackedList/PackedList.H +++ b/src/OpenFOAM/containers/Lists/PackedList/PackedList.H @@ -148,9 +148,11 @@ public: //- Masking for all bits below the offset inline static unsigned int maskLower(unsigned offset); - // Forward declaration of iteratorBase + // Forward declaration of iterators class iteratorBase; + class iterator; + class const_iterator; // Constructors @@ -355,7 +357,10 @@ public: public iteratorBase { - //- Should never violate const-ness! + //- Disallow copy constructor from const_iterator - violates const-ness! + iterator(const const_iterator&); + + //- Disallow assignment from const_iterator - violates const-ness! void operator=(const const_iterator&); public: diff --git a/src/OpenFOAM/db/IOobjectList/IOobjectList.H b/src/OpenFOAM/db/IOobjectList/IOobjectList.H index 44cb6f1dc1..71c63f9d38 100644 --- a/src/OpenFOAM/db/IOobjectList/IOobjectList.H +++ b/src/OpenFOAM/db/IOobjectList/IOobjectList.H @@ -63,7 +63,7 @@ public: // Constructors //- Construct given an initial estimate for the number of entries - explicit IOobjectList(const label nIoObjects = 100); + explicit IOobjectList(const label nIoObjects = 128); //- Construct from objectRegistry and instance path IOobjectList diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.H b/src/OpenFOAM/db/objectRegistry/objectRegistry.H index ce67831457..6c701e1d85 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.H +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.H @@ -82,12 +82,12 @@ public: // Constructors - //- Construct the time objectRegistry given an initial estimate + //- Construct the time objectRegistry given an initial estimate // for the number of entries explicit objectRegistry ( const Time& db, - const label nIoObjects = 100 + const label nIoObjects = 128 ); //- Construct a sub-registry given an IObject to describe the registry @@ -95,7 +95,7 @@ public: explicit objectRegistry ( const IOobject& io, - const label nIoObjects = 100 + const label nIoObjects = 128 ); diff --git a/src/OpenFOAM/meshes/meshShapes/edge/EdgeMap.H b/src/OpenFOAM/meshes/meshShapes/edge/EdgeMap.H index 6db2a7b016..7767fab30e 100644 --- a/src/OpenFOAM/meshes/meshShapes/edge/EdgeMap.H +++ b/src/OpenFOAM/meshes/meshShapes/edge/EdgeMap.H @@ -56,7 +56,7 @@ public: // Constructors //- Construct given initial map size - EdgeMap(label size = 100) + EdgeMap(const label size = 128) : HashTable >(size) {} diff --git a/src/OpenFOAM/primitives/strings/string/stringI.H b/src/OpenFOAM/primitives/strings/string/stringI.H index 38f8c80aa0..0720c27257 100644 --- a/src/OpenFOAM/primitives/strings/string/stringI.H +++ b/src/OpenFOAM/primitives/strings/string/stringI.H @@ -133,7 +133,7 @@ inline bool Foam::string::meta(const string& str, const char quote) template -inline Foam::string +inline Foam::string Foam::string::quotemeta(const string& str, const char quote) { if (!quote) @@ -205,14 +205,14 @@ inline Foam::string::size_type Foam::string::hash::operator() const string& key ) const { - register size_type hashVal = 0; + register size_type val = 0; for (string::const_iterator iter=key.begin(); iter!=key.end(); ++iter) { - hashVal = hashVal<<1 ^ *iter; + val = (val << 1) ^ *iter; } - return hashVal; + return val; }