/*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
}
}
+void VectorBase::Replace(void* newData)
+{
+ if(mData)
+ {
+ // adjust pointer to real beginning
+ SizeType* metadata = reinterpret_cast<SizeType*>(mData);
+
+ // Cause timming issue, we set new data before metadata delete.
+ mData = newData;
+
+ // delete metadata address after mData setup safety.
+ delete[](metadata - 2u);
+ }
+ else
+ {
+ // mData was nullptr. Just copy data address
+ mData = newData;
+ }
+}
+
void VectorBase::SetCount(SizeType count)
{
// someone can call Resize( 0u ) before ever populating the vector
{
// copy over the old data
memcpy(metaData, mData, oldCount * elementSize);
- // release old buffer
- Release();
}
- mData = metaData;
+ // release old buffer and set new data as mData
+ Replace(reinterpret_cast<void*>(metaData));
}
}
*/
void CopyMemory(char* destination, const char* source, size_t numberOfBytes);
+ /**
+ * @brief Replace the data as new data address.
+ * After replace, release the old data.
+ *
+ * It will be used when we want to keep the mData integrity.
+ *
+ * Does not call destructors on objects held.
+ * @param[in] newData new data address to be replaced
+ */
+ void Replace(void* newData);
+
private:
// not copyable as it does not know the size of elements
VectorBase(const VectorBase&) = delete; ///< Deleted copy constructor. @SINCE_1_0.0
{
if(this != &vector)
{
- if(VectorBase::mData)
- {
- Release();
- }
- VectorBase::mData = vector.mData;
- vector.mData = nullptr;
+ VectorAlgorithms<BaseType>::Replace(vector.mData);
+ vector.mData = nullptr;
}
return *this;
}