ENH: support HashTable iterator pointer dereference

This commit is contained in:
Mark Olesen
2019-04-06 16:00:21 +02:00
committed by Andrew Heather
parent d4eb17a9ff
commit 39c91d8440
20 changed files with 300 additions and 115 deletions

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
@ -31,9 +31,53 @@ Description
#include "HashTable.H"
#include "HashPtrTable.H"
#include "Map.H"
#include "FlatOutput.H"
using namespace Foam;
// Simple wrapper for testing purposes
class Label
{
label data_;
public:
Label()
:
data_(0)
{}
Label(label val)
:
data_(val)
{}
~Label()
{
Info<<"delete label: " << data_ << endl;
}
// Some arbitrary non-const method (for testing)
label increment()
{
return ++data_;
}
// Some arbitrary method (for testing)
std::string info() const
{
return "boxed label=" + std::to_string(data_);
}
friend Ostream& operator<<(Ostream& os, const Label& val)
{
os << val.data_;
return os;
}
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
@ -46,7 +90,7 @@ int main(int argc, char *argv[])
};
Info<< "table1: " << table1 << nl
<< "toc: " << table1.toc() << endl;
<< "toc: " << flatOutput(table1.toc()) << nl;
HashTable<label, label, Hash<label>> table2
{
@ -56,31 +100,156 @@ int main(int argc, char *argv[])
};
Info<< "table2: " << table2 << nl
<< "toc: " << table2.toc() << endl;
<< "toc: " << flatOutput(table2.toc()) << nl;
Map<label> table3(1);
table3.transfer(table2);
Info<< "table2: " << table2 << nl
<< "toc: " << table2.toc() << endl;
<< "toc: " << flatOutput(table2.toc()) << nl;
Info<< "table3: " << table3 << nl
<< "toc: " << table3.toc() << endl;
<< "toc: " << flatOutput(table3.toc()) << nl;
Map<label> table4(std::move(table3));
Info<< "table3: " << table3 << nl
<< "toc: " << table3.toc() << endl;
<< "toc: " << flatOutput(table3.toc()) << nl;
Info<< "table4: " << table4 << nl
<< "toc: " << table4.toc() << endl;
<< "toc: " << flatOutput(table4.toc()) << nl;
HashPtrTable<label, Foam::string> ptable1(0);
ptable1.insert("kjhkjh", autoPtr<label>::New(10));
{
HashTable<Label, Foam::string> table1(0);
table1.insert("abc", 5);
table1.insert("def", 10);
table1.insert("ghi", 15);
table1.insert("jkl", 20);
Info<< "PtrTable toc: " << ptable1.toc() << endl;
Info<< nl << "Table toc: " << flatOutput(table1.toc()) << nl;
Info<< "End\n" << endl;
for (const word k : { "abc" })
{
const auto iter = table1.cfind(k);
if (iter.good())
{
Info<< "have " << k << nl
<< " info: " << (*iter).info() << nl
// Good: does not compile
// << " info: " << iter->info() << nl
;
}
auto iter2 = table1.find(k);
if (iter2.good())
{
Info<< "have " << k << nl
<< " incr: " << (*iter2).increment() << nl
// Good: does not compile
// << " incr: " << iter2->increment() << nl
;
}
}
}
{
HashPtrTable<Label> ptable1(0);
ptable1.insert("abc", autoPtr<Label>::New(5));
ptable1.insert("def", autoPtr<Label>::New(10));
ptable1.insert("ghi", autoPtr<Label>::New(15));
ptable1.insert("jkl", autoPtr<Label>::New(20));
Info<< nl << "PtrTable toc: " << flatOutput(ptable1.toc()) << nl;
for (const word k : { "abc" })
{
const auto iter = ptable1.cfind(k);
// Note: increment() changes contents of pointers,
// not the pointers themselves.
if (iter.good())
{
Info<< "have " << k << nl
<< " addr: " << long(*iter) << nl
<< " info: " << (*iter)->info() << nl
<< " info: " << iter->info() << nl
<< " incr: " << iter->increment() << nl
;
}
auto iter2 = ptable1.find(k);
if (iter2.good())
{
Info<< "have " << k << nl
<< " incr: " << (*iter2)->increment() << nl
<< " incr: " << iter2->increment() << nl
;
}
}
// Attempt the same again
HashTable<Label*> tableView1;
HashTable<const Label*> tableView2;
forAllConstIters(ptable1, iter)
{
tableView1.insert(iter.key(), iter.val());
tableView2.insert(iter.key(), iter.val());
}
Info<< nl << "Table<pointer> toc: "
<< flatOutput(tableView1.toc()) << nl;
for (const word k : { "abc" })
{
const auto iter1 = tableView1.cfind(k);
// Note that increment changes contents of the pointers
// not the table
if (iter1.good())
{
Info<< "have " << k << nl
<< " addr: " << long(*iter1) << nl
<< " info: " << (*iter1)->info() << nl
<< " info: " << iter1->info() << nl
<< " incr: " << iter1->increment() << nl
;
}
auto iter2 = tableView2.cfind(k);
if (iter2.good())
{
Info<< "have " << k << nl
<< " addr: " << long(*iter2) << nl
<< " info: " << (*iter2)->info() << nl
<< " info: " << iter2->info() << nl
// Good: does not compile
// << " incr: " << iter2->increment() << nl
;
}
auto iter3 = tableView2.find(k);
if (iter3.good())
{
Info<< "have " << k << nl
<< " addr: " << long(*iter3) << nl
<< " info: " << (*iter3)->info() << nl
<< " info: " << iter3->info() << nl
// Good: does not compile
// << " incr: " << iter3->increment() << nl
;
}
}
Info<< nl << "Ending scope" << nl;
}
Info<< "\nEnd\n" << endl;
return 0;
}

View File

@ -30,7 +30,6 @@ Description
#include "argList.H"
#include "HashTable.H"
#include "HashPtrTable.H"
#include "Map.H"
#include "cpuTime.H"

View File

@ -58,7 +58,7 @@ void RotateFields
forAllConstIters(fields, fieldIter)
{
Info<< " Rotating " << fieldIter()->name() << endl;
Info<< " Rotating " << fieldIter->name() << endl;
GeometricField fld(*fieldIter(), mesh);
transform(fld, dimensionedTensor(rotT), fld);

View File

@ -360,7 +360,7 @@ int main(int argc, char *argv[])
forAllConstIters(objects, iter)
{
const word& headerClassName = iter()->headerClassName();
const word& headerClassName = iter->headerClassName();
if
(
@ -390,11 +390,11 @@ int main(int argc, char *argv[])
)
{
Info<< " Reading " << headerClassName
<< " : " << iter()->name() << endl;
<< " : " << iter->name() << endl;
fieldDictionary fDict(*iter(), headerClassName);
Info<< " Writing " << iter()->name() << endl;
Info<< " Writing " << iter->name() << endl;
fDict.regIOobject::write();
}
}

View File

@ -73,8 +73,8 @@ void Foam::vtkPVFoam::convertVolFields()
Info<< "<beg> " << FUNCTION_NAME << nl;
forAllConstIters(objects, iter)
{
Info<< " " << iter()->name()
<< " == " << iter()->objectPath() << nl;
Info<< " " << iter->name()
<< " == " << iter->objectPath() << nl;
}
printMemory();
}
@ -149,8 +149,8 @@ void Foam::vtkPVFoam::convertPointFields()
Info<< "<beg> convert volume -> point fields" << nl;
forAllConstIters(objects, iter)
{
Info<< " " << iter()->name()
<< " == " << iter()->objectPath() << nl;
Info<< " " << iter->name()
<< " == " << iter->objectPath() << nl;
}
printMemory();
}
@ -205,8 +205,8 @@ void Foam::vtkPVFoam::convertAreaFields()
Info<< "<beg> " << FUNCTION_NAME << nl;
forAllConstIters(objects, iter)
{
Info<< " " << iter()->name()
<< " == " << iter()->objectPath() << nl;
Info<< " " << iter->name()
<< " == " << iter->objectPath() << nl;
}
printMemory();
}
@ -282,8 +282,8 @@ void Foam::vtkPVFoam::convertLagrangianFields()
Info<< "converting OpenFOAM lagrangian fields" << nl;
forAllConstIters(objects, iter)
{
Info<< " " << iter()->name()
<< " == " << iter()->objectPath() << nl;
Info<< " " << iter->name()
<< " == " << iter->objectPath() << nl;
}
}

View File

@ -55,7 +55,7 @@ void MapConsistentVolFields
forAllConstIters(fields, fieldIter)
{
Info<< " interpolating " << fieldIter()->name()
Info<< " interpolating " << fieldIter->name()
<< endl;
// Read field. Do not auto-load old-time field
@ -63,7 +63,7 @@ void MapConsistentVolFields
IOobject fieldTargetIOobject
(
fieldIter()->name(),
fieldIter->name(),
meshTarget.time().timeName(),
meshTarget,
IOobject::MUST_READ,

View File

@ -65,7 +65,7 @@ void MapLagrangianFields
forAllConstIters(fields, fieldIter)
{
Info<< " mapping lagrangian field "
<< fieldIter()->name() << endl;
<< fieldIter->name() << endl;
// Read field (does not need mesh)
IOField<Type> fieldSource(*fieldIter());
@ -75,7 +75,7 @@ void MapLagrangianFields
(
IOobject
(
fieldIter()->name(),
fieldIter->name(),
meshTarget.time().timeName(),
cloud::prefix/cloudName,
meshTarget,
@ -103,7 +103,7 @@ void MapLagrangianFields
forAllConstIters(fieldFields, fieldIter)
{
Info<< " mapping lagrangian fieldField "
<< fieldIter()->name() << endl;
<< fieldIter->name() << endl;
// Read field (does not need mesh)
IOField<Field<Type>> fieldSource(*fieldIter());
@ -114,7 +114,7 @@ void MapLagrangianFields
(
IOobject
(
fieldIter()->name(),
fieldIter->name(),
meshTarget.time().timeName(),
cloud::prefix/cloudName,
meshTarget,
@ -142,7 +142,7 @@ void MapLagrangianFields
forAllConstIters(fieldFields, fieldIter)
{
Info<< " mapping lagrangian fieldField "
<< fieldIter()->name() << endl;
<< fieldIter->name() << endl;
// Read field (does not need mesh)
CompactIOField<Field<Type>, Type> fieldSource(*fieldIter());
@ -152,7 +152,7 @@ void MapLagrangianFields
(
IOobject
(
fieldIter()->name(),
fieldIter->name(),
meshTarget.time().timeName(),
cloud::prefix/cloudName,
meshTarget,

View File

@ -57,7 +57,7 @@ void MapVolFields
{
IOobject fieldTargetIOobject
(
fieldIter()->name(),
fieldIter->name(),
meshTarget.time().timeName(),
meshTarget,
IOobject::MUST_READ,
@ -66,7 +66,7 @@ void MapVolFields
if (fieldTargetIOobject.typeHeaderOk<fieldType>(true))
{
Info<< " interpolating " << fieldIter()->name() << endl;
Info<< " interpolating " << fieldIter->name() << endl;
// Read field fieldSource. Do not auto-load old-time fields
fieldType fieldSource(*fieldIter(), meshSource, false);

View File

@ -43,7 +43,7 @@ void UnMapped(const IOobjectList& objects)
forAllConstIters(fields, fieldIter)
{
mvBak(fieldIter()->objectPath(), "unmapped");
mvBak(fieldIter->objectPath(), "unmapped");
}
}

View File

@ -62,7 +62,7 @@ void MapLagrangianFields
forAllConstIters(fields, fieldIter)
{
const word& fieldName = fieldIter()->name();
const word& fieldName = fieldIter->name();
Info<< " mapping lagrangian field " << fieldName << endl;
@ -101,7 +101,7 @@ void MapLagrangianFields
forAllConstIters(fieldFields, fieldIter)
{
const word& fieldName = fieldIter()->name();
const word& fieldName = fieldIter->name();
Info<< " mapping lagrangian fieldField " << fieldName << endl;
@ -153,7 +153,7 @@ void MapLagrangianFields
forAllConstIters(fieldFields, fieldIter)
{
const word& fieldName = fieldIter()->name();
const word& fieldName = fieldIter->name();
Info<< " mapping lagrangian fieldField " << fieldName << endl;

View File

@ -43,7 +43,7 @@ void UnMapped(const IOobjectList& objects)
forAllConstIters(fields, fieldIter)
{
mvBak(fieldIter()->objectPath(), "unmapped");
mvBak(fieldIter->objectPath(), "unmapped");
}
}