- previously had a mismash of const/non-const attributes on iterators that were confused with the attributes of the object being accessed. - use the iterator keys() and object() methods consistently for all internal access of the HashTable iterators. This makes the intention clearer, the code easier to maintain, and protects against any possible changes in the definition of the operators. - 'operator*': The standard form expected by STL libraries. However, for the std::map, this dereferences to a <key,value> pair, whereas OpenFOAM dereferences simply to <value>. - 'operator()': OpenFOAM treats this like the 'operator*' - adjusted the values of end() and cend() to reinterpret from nullObject instead of returning a static iteratorEnd() object. This means that C++ templates can now correctly deduce and match the return types from begin() and end() consistently. So that range-based now works. Eg, HashTable<label> table1 = ...; for (auto i : table1) { Info<< i << endl; } Since the 'operator*' returns hash table values, this prints all the values in the table.
193 lines
5.3 KiB
C
193 lines
5.3 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "HashTable.H"
|
|
#include "IOstreams.H"
|
|
#include "IStringStream.H"
|
|
#include "OStringStream.H"
|
|
|
|
using namespace Foam;
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
// Main program:
|
|
|
|
int main()
|
|
{
|
|
HashTable<scalar> table1
|
|
{
|
|
{"aaa", 1.0},
|
|
{"aba", 2.0},
|
|
{"aca", 3.0},
|
|
{"ada", 4.0},
|
|
{"aeq", 5.0},
|
|
{"aaw", 6.0},
|
|
{"abs", 7.0},
|
|
{"acr", 8.0},
|
|
{"adx", 9.0},
|
|
{"aec", 10.0}
|
|
};
|
|
|
|
// Info<< "\ntable1: " << table1<< endl;
|
|
|
|
// Erase by key
|
|
table1.erase("aaw");
|
|
|
|
// Erase by iterator
|
|
HashTable<scalar>::iterator iter = table1.find("abs");
|
|
table1.erase(iter);
|
|
|
|
Info<< "\ntable1 toc: " << table1.toc() << endl;
|
|
Info<< "\ntable1 sortedToc: " << table1.sortedToc() << endl;
|
|
table1.printInfo(Info)
|
|
<< "table1 [" << table1.size() << "] " << endl;
|
|
forAllConstIters(table1, iter)
|
|
{
|
|
Info<< iter.key() << " => " << iter() << nl;
|
|
}
|
|
|
|
table1.set("acr", 108);
|
|
table1.set("adx", 109);
|
|
table1.set("aec", 100);
|
|
table1("aaw") -= 1000;
|
|
table1("aeq") += 1000;
|
|
|
|
Info<< "\noverwrote some values table1: " << table1 << endl;
|
|
|
|
Info<< "\ntest find:" << endl;
|
|
Info<< table1.find("aaa")() << nl
|
|
<< table1.find("aba")() << nl
|
|
<< table1.find("aca")() << nl
|
|
<< table1.find("ada")() << nl
|
|
<< table1.find("aeq")() << nl
|
|
<< table1.find("acr")() << nl
|
|
<< table1.find("adx")() << nl
|
|
<< table1.find("aec")() << nl
|
|
<< table1["aaa"] << nl;
|
|
|
|
{
|
|
OStringStream os;
|
|
os << table1;
|
|
HashTable<scalar> readTable(IStringStream(os.str())(), 100);
|
|
|
|
Info<< "Istream constructor:" << readTable << endl;
|
|
}
|
|
|
|
|
|
HashTable<scalar> table2(table1);
|
|
HashTable<scalar> table3(table1.xfer());
|
|
|
|
Info<< "\ncopy table1 -> table2" << nl
|
|
<< "transfer table1 -> table3 via the xfer() method" << nl;
|
|
|
|
Info<< "\ntable1" << table1 << nl
|
|
<< "\ntable2" << table2 << nl
|
|
<< "\ntable3" << table3 << nl;
|
|
|
|
Info<< "\nerase table2 by iterator" << nl;
|
|
forAllIters(table2, iter)
|
|
{
|
|
Info<< "erasing " << iter.key() << " => " << iter.object() << " ... ";
|
|
table2.erase(iter);
|
|
Info<< "erased" << endl;
|
|
}
|
|
|
|
Info<< "\ntable1" << table1 << nl
|
|
<< "\ntable2" << table2 << nl
|
|
<< "\ntable3" << table3 << nl;
|
|
|
|
table3.resize(1);
|
|
Info<< "\nresize(1) table3" << nl;
|
|
table3.printInfo(Info)
|
|
<< table3 << nl;
|
|
|
|
table3.resize(10000);
|
|
Info<< "\nresize(10000) table3" << nl;
|
|
table3.printInfo(Info)
|
|
<< table3 << nl;
|
|
|
|
HashTable<scalar> table4;
|
|
|
|
table4 = table3;
|
|
Info<< "\ncopy table3 -> table4 " << table4 << nl;
|
|
|
|
Info<< "\nclear table4 ... ";
|
|
table4.clear();
|
|
Info<< "[" << table4.size() << "] " << table4 << nl;
|
|
|
|
table1 = table3;
|
|
Info<< "\ncopy table3 -> table1 (previously transferred)" << table1 << nl;
|
|
|
|
Info<< "test table1 == table3 : " << (table1 == table3) << nl;
|
|
table1.erase(table1.begin());
|
|
Info<< "removed an element - test table1 != table3 : "
|
|
<< (table1 != table3) << nl;
|
|
|
|
// Insert a few things into table2
|
|
table2.set("ada", 14.0);
|
|
table2.set("aeq", 15.0);
|
|
table2.set("aaw", 16.0);
|
|
table2.set("abs", 17.0);
|
|
table2.set("adx", 20.0);
|
|
|
|
Info<< "\ntable1" << table1 << nl
|
|
<< "\ntable2" << table2 << nl;
|
|
|
|
label nErased = table1.erase(table2);
|
|
|
|
Info<< "\nerase table2 keys from table1 (removed "
|
|
<< nErased << " elements)" << nl
|
|
<< "\ntable1" << table1 << nl
|
|
<< "\ntable2" << table2 << nl;
|
|
|
|
|
|
Info<< "\ntable3" << table3
|
|
<< "\nclearStorage table3 ... ";
|
|
table3.clearStorage();
|
|
Info<< table3 << nl;
|
|
|
|
table1 =
|
|
{
|
|
{"aca", 3.0},
|
|
{"aaw", 6.0},
|
|
{"acr", 8.0},
|
|
{"aec", 10.0}
|
|
};
|
|
|
|
Info<< "\ntable1" << table1 << nl;
|
|
|
|
Info<< "\nrange-for(table1)" << nl;
|
|
for (auto const& it : table1)
|
|
{
|
|
Info<< " " << it << nl;
|
|
}
|
|
|
|
Info<< "\nDone\n";
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|