diff --git a/applications/test/HashPtrTable/Test-HashPtrTable.C b/applications/test/HashPtrTable/Test-HashPtrTable.C index a7ad4bc2f1..db15bdde27 100644 --- a/applications/test/HashPtrTable/Test-HashPtrTable.C +++ b/applications/test/HashPtrTable/Test-HashPtrTable.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011 OpenFOAM Foundation - Copyright (C) 2017-2020 OpenCFD Ltd. + Copyright (C) 2017-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -125,6 +125,7 @@ int main() myTable.set("pi", new double(3.14159)); myTable.set("natlog", new double(2.718282)); myTable.insert("sqrt2", autoPtr::New(1.414214)); + myTable.insert("euler", autoPtr::New(0.577216)); HashTable, word, string::hash> myTable1; @@ -139,14 +140,24 @@ int main() myTable2.set("natlog", autoPtr(new double(2.718282))); myTable2.insert("sqrt2", autoPtr::New(1.414214)); - // Info<< myTable << endl; + Info<< "Initial table" << nl; printTable(myTable); + + Info<< "print" << nl; Info<< myTable2 << nl; - auto iter2 = myTable2.find("pi"); - - Info<<"PI: " << **iter2 << nl; - + { + auto iter2 = myTable2.find("pi"); + Info<< nl "Got pi="; + if (iter2.good()) + { + Info<< **iter2 << nl; + } + else + { + Info<< "not-found" << nl; + } + } HashPtrTable copy(myTable); @@ -165,6 +176,9 @@ int main() myTable.erase("abc"); myTable.erase("unknownKey"); + myTable.release("euler"); + + Info<< "After erasure" << nl; printTable(myTable); HashPtrTable moved(std::move(copy)); diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.C b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.C index 89351b375a..eedbc26416 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.C +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2017-2020 OpenCFD Ltd. + Copyright (C) 2017-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -26,8 +26,9 @@ License \*---------------------------------------------------------------------------*/ -#include "error.H" #include "HashPtrTable.H" +#include "autoPtr.H" +#include "error.H" // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // @@ -77,6 +78,28 @@ Foam::HashPtrTable::~HashPtrTable() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +template +Foam::autoPtr Foam::HashPtrTable::release(iterator& iter) +{ + if (iter.good()) + { + autoPtr old(iter.val()); + iter.val() = nullptr; + return old; + } + + return nullptr; +} + + +template +Foam::autoPtr Foam::HashPtrTable::release(const Key& key) +{ + iterator iter(this->find(key)); + return this->release(iter); +} + + template Foam::autoPtr Foam::HashPtrTable::remove(iterator& iter) { diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H index ee7ea6a49b..d691cca8d9 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2017-2020 OpenCFD Ltd. + Copyright (C) 2017-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -93,7 +93,7 @@ public: // Constructors //- Default construct with default table capacity - inline HashPtrTable(); + HashPtrTable() = default; //- Construct given initial table capacity inline explicit HashPtrTable(const label size); @@ -130,15 +130,26 @@ public: // Edit + //- Release ownership of the pointer and replace with a nullptr + // Includes a safeguard against the end-iterator. + // + // \return the entry's old value as an encapsulated pointer. + autoPtr release(iterator& iter); + + //- Release ownership of the pointer and replace with a nullptr + // + // \return the entry's old value as an encapsulated pointer. + autoPtr release(const Key& key); + //- Remove entry specified by given iterator. // Includes a safeguard against the end-iterator. // - // \return entry as an encapsulated pointer. + // \return the entry's old value as an encapsulated pointer. autoPtr remove(iterator& iter); //- Remove entry specified by given key. // - // \return entry as an encapsulated pointer. + // \return the entry's old value as an encapsulated pointer. autoPtr remove(const Key& key); //- Erase entry specified by given iterator and delete the diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H index 08f40bd2c7..ee47d0108c 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H @@ -29,13 +29,6 @@ License // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -template -inline Foam::HashPtrTable::HashPtrTable() -: - parent_type() -{} - - template inline Foam::HashPtrTable::HashPtrTable(const label size) :