aboutsummaryrefslogtreecommitdiffstats
path: root/chilbert/BigBitVec.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'chilbert/BigBitVec.hpp')
-rw-r--r--chilbert/BigBitVec.hpp31
1 files changed, 19 insertions, 12 deletions
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<FBV_UINT[]>{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<FBV_UINT[]>{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<FBV_UINT[]>{new FBV_UINT[1]};
+ }
+
+ m_iRacks = 1;
m_pcRacks[0] = j;
- memset(m_pcRacks.get() + 1, 0, sizeof(CFixBitVec) * (m_iRacks - 1));
return *this;
}