From b89d7669fd9b9d1b9793a31ca36734e9244f9eb9 Mon Sep 17 00:00:00 2001 From: orlandini Date: Tue, 5 Sep 2023 16:36:36 -0300 Subject: [PATCH] fix(pzvec): move assignment fix when this was manvector --- UnitTest_PZ/TestVecTypes/VecTypesUnitTest.cpp | 14 ++++++ Util/pzvec.h | 50 ++++++++++++++----- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/UnitTest_PZ/TestVecTypes/VecTypesUnitTest.cpp b/UnitTest_PZ/TestVecTypes/VecTypesUnitTest.cpp index 36fc78833..4d8d9573f 100644 --- a/UnitTest_PZ/TestVecTypes/VecTypesUnitTest.cpp +++ b/UnitTest_PZ/TestVecTypes/VecTypesUnitTest.cpp @@ -144,6 +144,20 @@ TEST_CASE("mixedvecs_tests","[test_vectypes]") { } REQUIRE(true); + + try{ + TPZManVector manvec(3,0); + + auto func = [](TPZVec &vec){ + TPZVec myothervec(2,0); + vec = std::move(myothervec); + }; + + func(manvec); + }catch(...){ + REQUIRE(false); + } + REQUIRE(true); //move assignment operator try{ diff --git a/Util/pzvec.h b/Util/pzvec.h index fc47ddf70..4db26a0fd 100644 --- a/Util/pzvec.h +++ b/Util/pzvec.h @@ -383,19 +383,43 @@ TPZVec &TPZVec::operator=(const TPZVec ©){ template< class T > TPZVec &TPZVec::operator=(TPZVec &&rval){ if(this != &rval){ - fNElements = rval.fNElements; - if(fStore) delete [] fStore; - if(rval.fNAlloc){ - fStore = rval.fStore; - }else{ - fStore = new T[fNElements]; - for (int64_t i = 0; i < fNElements; i++) - fStore[i] = rval.fStore[i]; - } - fNAlloc = fNElements;//perhaps rval.fNalloc was 0 - rval.fStore = nullptr; - rval.fNElements = 0; - rval.fNAlloc = 0; + + if(fNAlloc && rval.fNAlloc){ + //scenario 1: both vectors have allocated dynamic memory + delete [] fStore; + fNAlloc = rval.fNAlloc; + fNElements = rval.fNElements; + fStore = rval.fStore; + rval.fStore = nullptr; + rval.fNAlloc = 0; + rval.fNElements = 0; + return *this; + } + if(!fNAlloc && fNElements >= rval.fNElements){ + //scenario 2: our static memory can fit their elements + for (int64_t i = 0; i < fNElements; i++){ + fStore[i] = rval.fStore[i]; + } + fNElements = rval.fNElements; + //no need to modify rval, it was just a copy + return *this; + } + if(fNAlloc) delete [] fStore; + + + fNElements = rval.fNElements; + if(rval.fNAlloc){ + fStore = rval.fStore; + rval.fStore = nullptr; + rval.fNElements = 0; + rval.fNAlloc = 0; + }else{ + fStore = new T[fNElements]; + for (int64_t i = 0; i < fNElements; i++){ + fStore[i] = rval.fStore[i]; + } + } + fNAlloc = fNElements; } return *this; }