From a0a6ee8f787c07fb7ca5b63a52131660eed26586 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 11 Aug 2018 13:39:10 +0200 Subject: Fix BigBitVec assignment operators --- chilbert/BigBitVec.hpp | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'chilbert') diff --git a/chilbert/BigBitVec.hpp b/chilbert/BigBitVec.hpp index 5053b1a..d25d1c8 100644 --- a/chilbert/BigBitVec.hpp +++ b/chilbert/BigBitVec.hpp @@ -101,20 +101,19 @@ public: CBigBitVec& operator=(const CBigBitVec& vec) { if (m_iRacks < vec.m_iRacks) { + m_iRacks = vec.m_iRacks; + m_pcRacks = std::unique_ptr{new FBV_UINT[m_iRacks]}; + memcpy(m_pcRacks.get(), + vec.m_pcRacks.get(), + sizeof(CFixBitVec) * m_iRacks); + } else if (vec.m_iRacks > 0) { + m_iRacks = vec.m_iRacks; memcpy(m_pcRacks.get(), vec.m_pcRacks.get(), sizeof(CFixBitVec) * m_iRacks); } else { - if (m_pcRacks) { - if (vec.m_pcRacks) { - memcpy(m_pcRacks.get(), - vec.m_pcRacks.get(), - sizeof(CFixBitVec) * vec.m_iRacks); - } - memset(m_pcRacks.get() + vec.m_iRacks, - 0, - sizeof(CFixBitVec) * (m_iRacks - vec.m_iRacks)); - } + m_iRacks = 0; + m_pcRacks.reset(); } return *this; @@ -124,15 +123,23 @@ public: CBigBitVec& operator=(const CFixBitVec& vec) { + if (!m_pcRacks) { + m_pcRacks = std::unique_ptr{new FBV_UINT[1]}; + } + + m_iRacks = 1; m_pcRacks[0] = vec.rack(); - memset(m_pcRacks.get() + 1, 0, sizeof(FBV_UINT) * (m_iRacks - 1)); return *this; } CBigBitVec& operator=(const FBV_UINT j) { + if (!m_pcRacks) { + m_pcRacks = std::unique_ptr{new FBV_UINT[1]}; + } + + m_iRacks = 1; m_pcRacks[0] = j; - memset(m_pcRacks.get() + 1, 0, sizeof(CFixBitVec) * (m_iRacks - 1)); return *this; } -- cgit v1.2.1