diff --git a/applications/test/PtrList/Test-PtrList.C b/applications/test/PtrList/Test-PtrList.C index f3826d8a29..e6821e38d1 100644 --- a/applications/test/PtrList/Test-PtrList.C +++ b/applications/test/PtrList/Test-PtrList.C @@ -599,7 +599,9 @@ int main(int argc, char *argv[]) dynPlanes.set(6, new plane(vector(2,2,1), vector::one)); dynPlanes.set(10, new plane(vector(4,5,6), vector::one)); - dynPlanes.emplace(12, vector(3,2,1), vector::one); + Info<< "emplaced :" + << dynPlanes.emplace(12, vector(3,2,1), vector::one) << endl; + dynPlanes.emplace_back(Zero, vector::one); } diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H index 50175e0887..765c34b89e 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H @@ -207,9 +207,9 @@ public: inline bool emplace(const Key& key, Args&&... args); //- Emplace set an entry, overwriting any existing entries. - // \return True, since it always overwrites any entries. + // \return Reference to the new element. template - inline bool emplace_set(const Key& key, Args&&... args); + inline T& emplace_set(const Key& key, Args&&... args); //- No insert() with raw pointers (potential memory leaks). //- Use insert() with autoPtr or set() diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H index 682d24c8f6..f207bbceac 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H @@ -95,13 +95,15 @@ inline bool Foam::HashPtrTable::emplace template template -inline bool Foam::HashPtrTable::emplace_set +inline T& Foam::HashPtrTable::emplace_set ( const Key& key, Args&&... args ) { - return this->set(key, new T(std::forward(args)...)); + T* ptr = new T(std::forward(args)...); + (void)this->set(key, ptr); + return *ptr; } diff --git a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H index 552184af39..8a7573645e 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H +++ b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H @@ -174,9 +174,11 @@ public: //- Remove and return the top element. Can be called on an empty list. inline autoPtr remove(); - //- Construct and set an element + //- Construct and set a new element at given position, + //- (discard old element at that location). + //- Return reference to the new list element. template - inline autoPtr emplace(const label i, Args&&... args); + inline T& emplace(const label i, Args&&... args); //- Set element to given pointer and return old element (can be null). //- Auto-sizes list as required. diff --git a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H index 47ac482d83..1c929f57db 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H +++ b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H @@ -220,8 +220,9 @@ template template inline T& Foam::PtrDynList::emplace_back(Args&&... args) { - this->push_back(new T(std::forward(args)...)); - return this->back(); + T* ptr = new T(std::forward(args)...); + this->push_back(ptr); + return *ptr; } @@ -346,13 +347,15 @@ inline Foam::autoPtr Foam::PtrDynList::remove() template template -inline Foam::autoPtr Foam::PtrDynList::emplace +inline T& Foam::PtrDynList::emplace ( const label i, Args&&... args ) { - return this->set(i, new T(std::forward(args)...)); + T* ptr = new T(std::forward(args)...); + (void)this->set(i, ptr); + return *ptr; } diff --git a/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H b/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H index 8a5c89cb61..f59cfaff26 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H +++ b/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H @@ -172,9 +172,11 @@ public: //- Move append another list to the end of this list. inline void push_back(PtrList&& other); - //- Construct and set an element + //- Construct and set a new element at given position, + //- (discard old element at that location). + //- Return reference to the new list element. template - inline autoPtr emplace(const label i, Args&&... args); + inline T& emplace(const label i, Args&&... args); //- Set element to given pointer and return old element (can be null) // No-op if the new pointer value is identical to the current content. diff --git a/src/OpenFOAM/containers/PtrLists/PtrList/PtrListI.H b/src/OpenFOAM/containers/PtrLists/PtrList/PtrListI.H index d08be8d531..921c4bed09 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrList/PtrListI.H +++ b/src/OpenFOAM/containers/PtrLists/PtrList/PtrListI.H @@ -105,8 +105,9 @@ template template inline T& Foam::PtrList::emplace_back(Args&&... args) { - UPtrList::push_back(new T(std::forward(args)...)); - return this->back(); + T* ptr = new T(std::forward(args)...); + UPtrList::push_back(ptr); + return *ptr; } @@ -171,13 +172,15 @@ inline void Foam::PtrList::push_back(PtrList&& other) template template -inline Foam::autoPtr Foam::PtrList::emplace +inline T& Foam::PtrList::emplace ( const label i, Args&&... args ) { - return set(i, new T(std::forward(args)...)); + T* ptr = new T(std::forward(args)...); + (void)this->set(i, ptr); + return *ptr; }