diff --git a/applications/test/PtrListDictionary/Make/files b/applications/test/PtrListDictionary/Make/files new file mode 100644 index 0000000000..a3c4c87ba4 --- /dev/null +++ b/applications/test/PtrListDictionary/Make/files @@ -0,0 +1,3 @@ +Test-PtrListDictionary.C + +EXE = $(FOAM_USER_APPBIN)/Test-PtrListDictionary diff --git a/applications/test/PtrListDictionary/Make/options b/applications/test/PtrListDictionary/Make/options new file mode 100644 index 0000000000..e69de29bb2 diff --git a/applications/test/PtrListDictionary/Test-PtrListDictionary.C b/applications/test/PtrListDictionary/Test-PtrListDictionary.C new file mode 100644 index 0000000000..33aa3b2792 --- /dev/null +++ b/applications/test/PtrListDictionary/Test-PtrListDictionary.C @@ -0,0 +1,123 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +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 . + +Application + +Description + +\*---------------------------------------------------------------------------*/ + +#include "OSspecific.H" + +#include "scalar.H" + +#include "IOstreams.H" +#include "PtrListDictionary.H" + +using namespace Foam; + +class Scalar +{ + scalar data_; + +public: + + Scalar() + : + data_(0) + {} + + Scalar(scalar val) + : + data_(val) + {} + + ~Scalar() + { + Info<<"delete Scalar: " << data_ << endl; + } + + friend Ostream& operator<<(Ostream& os, const Scalar& val) + { + os << val.data_; + return os; + } +}; + + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + PtrListDictionary scalarDict(10); + forAll(scalarDict, i) + { + word key("ent" + name(i)); + scalarDict.set(i, key, new Scalar(1.3*i)); + } + + Info<< nl << "scalarDict1: " << endl; + forAll(scalarDict, i) + { + Info<< "elem " << i << " = " << scalarDict[i] << endl; + } + + Scalar* ent8Ptr = scalarDict.lookupPtr("ent8"); + + Info<< "ent8 = " << *ent8Ptr << endl; + + PtrListDictionary scalarDict2(15); + forAll(scalarDict2, i) + { + word key("ent" + name(i)); + scalarDict2.set(i, key, new Scalar(1.3*i)); + } + Info<< nl << "scalarDict2: " << endl; + forAll(scalarDict2, i) + { + Info<< "elem " << i << " = " << scalarDict2[i] << endl; + } + + scalarDict.transfer(scalarDict2); + + Scalar* p = scalarDict.lookupPtr("ent8"); + + if (p) + { + Info<< "found: " << *p << endl; + } + else + { + Info<< "no p: " << endl; + } + + scalarDict.clear(); + + Info<< nl << "Done." << endl; + return 0; +} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/containers/Dictionaries/DictionaryBase/DictionaryBase.H b/src/OpenFOAM/containers/Dictionaries/DictionaryBase/DictionaryBase.H index 43634bc93a..f9294eedd0 100644 --- a/src/OpenFOAM/containers/Dictionaries/DictionaryBase/DictionaryBase.H +++ b/src/OpenFOAM/containers/Dictionaries/DictionaryBase/DictionaryBase.H @@ -74,13 +74,15 @@ class DictionaryBase : public IDLListType { - // Private data +protected: + + // Protected data //- HashTable of the entries held on the IDLListType for quick lookup HashTable hashedTs_; - // Private Member functions + // Protected Member functions // Add the IDLListType entries into the HashTable void addEntries(); diff --git a/src/OpenFOAM/containers/Dictionaries/PtrDictionary/PtrDictionary.H b/src/OpenFOAM/containers/Dictionaries/PtrDictionary/PtrDictionary.H index e6d1a5f999..a287e326cb 100644 --- a/src/OpenFOAM/containers/Dictionaries/PtrDictionary/PtrDictionary.H +++ b/src/OpenFOAM/containers/Dictionaries/PtrDictionary/PtrDictionary.H @@ -25,11 +25,10 @@ Class Foam::PtrDictionary Description - Template dictionary class which does not manages the storage - associated with it. + Template dictionary class which manages the storage associated with it. - It is derived from DictionaryBase instantiated on a non-memory managed - form of intrusive doubly-linked list of T. + It is derived from DictionaryBase instantiated on a memory managed form of + intrusive doubly-linked list of \. SourceFiles PtrDictionary.C diff --git a/src/OpenFOAM/containers/Dictionaries/PtrListDictionary/PtrListDictionary.C b/src/OpenFOAM/containers/Dictionaries/PtrListDictionary/PtrListDictionary.C new file mode 100644 index 0000000000..dae34e82fe --- /dev/null +++ b/src/OpenFOAM/containers/Dictionaries/PtrListDictionary/PtrListDictionary.C @@ -0,0 +1,127 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +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 . + +\*---------------------------------------------------------------------------*/ + +#include "PtrListDictionary.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template +Foam::PtrListDictionary::PtrListDictionary(const label size) +: + DictionaryBase, T>(2*size) +{ + PtrList::setSize(size); +} + + +template +Foam::PtrListDictionary::PtrListDictionary(const PtrListDictionary& dict) +: + DictionaryBase, T>(dict) +{} + + +template +template +Foam::PtrListDictionary::PtrListDictionary(Istream& is, const INew& iNew) +: + DictionaryBase, T>(is, iNew) +{} + + +template +Foam::PtrListDictionary::PtrListDictionary(Istream& is) +: + DictionaryBase, T>(is) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +inline Foam::autoPtr Foam::PtrListDictionary::set +( + const label i, + const word& key, + T* ptr +) +{ + if (!DictionaryBase, T>::hashedTs_.insert(key, ptr)) + { + FatalErrorIn + ( + "PtrListDictionary::set(const label i, const word& key, T* ptr)" + ) << "Cannot insert with key '" << key << "' into hash-table" + << abort(FatalError); + } + return PtrList::set(i, ptr); +} + + +template +inline Foam::autoPtr Foam::PtrListDictionary::set +( + const label i, + const word& key, + autoPtr& aptr +) +{ + T* ptr = aptr.ptr(); + if (!DictionaryBase, T>::hashedTs_.insert(key, ptr)) + { + FatalErrorIn + ( + "PtrListDictionary::" + "set(const label i, const word& key, autoPtr& aptr)" + ) << "Cannot insert with key '" << key << "' into hash-table" + << abort(FatalError); + } + return PtrList::set(i, ptr); +} + + +template +inline Foam::autoPtr Foam::PtrListDictionary::set +( + const label i, + const word& key, + tmp& t +) +{ + T* ptr = t.ptr(); + if (!DictionaryBase, T>::hashedTs_.insert(key, ptr)) + { + FatalErrorIn + ( + "PtrListDictionary::" + "set(const label i, const word& key, tmp& t)" + ) << "Cannot insert with key '" << key << "' into hash-table" + << abort(FatalError); + } + return PtrList::set(i, ptr); +} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/containers/Dictionaries/PtrListDictionary/PtrListDictionary.H b/src/OpenFOAM/containers/Dictionaries/PtrListDictionary/PtrListDictionary.H new file mode 100644 index 0000000000..761bccd76e --- /dev/null +++ b/src/OpenFOAM/containers/Dictionaries/PtrListDictionary/PtrListDictionary.H @@ -0,0 +1,121 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +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 . + +Class + Foam::PtrListDictionary + +Description + Template dictionary class which manages the storage associated with it. + + It is derived from DictionaryBase instantiated on the memory managed PtrList + of \ to provide ordered indexing in addition to the dictionary lookup. + +SourceFiles + PtrListDictionary.C + +\*---------------------------------------------------------------------------*/ + +#ifndef PtrListDictionary_H +#define PtrListDictionary_H + +#include "DictionaryBase.H" +#include "PtrList.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class PtrListDictionary Declaration +\*---------------------------------------------------------------------------*/ + +template +class PtrListDictionary +: + public DictionaryBase, T> +{ + +public: + + // Constructors + + //- Construct given initial list size + PtrListDictionary(const label size); + + //- Copy construct + PtrListDictionary(const PtrListDictionary&); + + //- Construct from Istream using given Istream constructor class + template + PtrListDictionary(Istream&, const INew&); + + //- Construct from Istream + PtrListDictionary(Istream&); + + + // Member functions + + //- Set element to pointer provided and return old element + autoPtr set(const label, const word& key, T*); + + //- Set element to autoPtr value provided and return old element + autoPtr set(const label, const word& key, autoPtr&); + + //- Set element to tmp value provided and return old element + autoPtr set(const label, const word& key, tmp&); + + + // Member operators + + using PtrList::operator[]; + + //- Find and return entry + const T& operator[](const word& key) const + { + return *DictionaryBase, T>::operator[](key); + } + + //- Find and return entry + T& operator[](const word& key) + { + return *DictionaryBase, T>::operator[](key); + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "PtrListDictionary.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //