mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 00:03:03 +04:00
Use BufferArea in more places
This commit is contained in:
@@ -74,6 +74,25 @@ public:
|
||||
allocate_((void**)(&ptr), static_cast<ushort>(sizeof(T)), count, alignment);
|
||||
}
|
||||
|
||||
/** @brief Fill one of buffers with zeroes
|
||||
|
||||
@param ptr pointer to memory block previously added using BufferArea::allocate
|
||||
|
||||
BufferArea::commit must be called before using this method
|
||||
*/
|
||||
template <typename T>
|
||||
void zeroFill(T*&ptr)
|
||||
{
|
||||
CV_Assert(ptr);
|
||||
zeroFill_((void**)&ptr);
|
||||
}
|
||||
|
||||
/** @brief Fill all buffers with zeroes
|
||||
|
||||
BufferArea::commit must be called before using this method
|
||||
*/
|
||||
void zeroFill();
|
||||
|
||||
/** @brief Allocate memory and initialize all bound pointers
|
||||
|
||||
Each pointer bound to the area with the BufferArea::allocate will be initialized and will be set
|
||||
@@ -83,10 +102,18 @@ public:
|
||||
*/
|
||||
void commit();
|
||||
|
||||
/** @brief Release all memory and unbind all pointers
|
||||
|
||||
All memory will be freed and all pointers will be reset to NULL and untied from the area allowing
|
||||
to call `allocate` and `commit` again.
|
||||
*/
|
||||
void release();
|
||||
|
||||
private:
|
||||
BufferArea(const BufferArea &); // = delete
|
||||
BufferArea &operator=(const BufferArea &); // = delete
|
||||
void allocate_(void **ptr, ushort type_size, size_t count, ushort alignment);
|
||||
void zeroFill_(void **ptr);
|
||||
|
||||
private:
|
||||
class Block;
|
||||
|
||||
@@ -66,6 +66,16 @@ public:
|
||||
*ptr = buf;
|
||||
return static_cast<void*>(static_cast<uchar*>(*ptr) + type_size * count);
|
||||
}
|
||||
bool operator==(void **other) const
|
||||
{
|
||||
CV_Assert(ptr && other);
|
||||
return *ptr == *other;
|
||||
}
|
||||
void zeroFill() const
|
||||
{
|
||||
CV_Assert(ptr && *ptr);
|
||||
memset(static_cast<uchar*>(*ptr), 0, count * type_size);
|
||||
}
|
||||
private:
|
||||
void **ptr;
|
||||
void * raw_mem;
|
||||
@@ -85,10 +95,7 @@ BufferArea::BufferArea(bool safe_) :
|
||||
|
||||
BufferArea::~BufferArea()
|
||||
{
|
||||
for(std::vector<Block>::const_iterator i = blocks.begin(); i != blocks.end(); ++i)
|
||||
i->cleanup();
|
||||
if (oneBuf)
|
||||
fastFree(oneBuf);
|
||||
release();
|
||||
}
|
||||
|
||||
void BufferArea::allocate_(void **ptr, ushort type_size, size_t count, ushort alignment)
|
||||
@@ -100,6 +107,26 @@ void BufferArea::allocate_(void **ptr, ushort type_size, size_t count, ushort al
|
||||
totalSize += blocks.back().getByteCount();
|
||||
}
|
||||
|
||||
void BufferArea::zeroFill_(void **ptr)
|
||||
{
|
||||
for(std::vector<Block>::const_iterator i = blocks.begin(); i != blocks.end(); ++i)
|
||||
{
|
||||
if (*i == ptr)
|
||||
{
|
||||
i->zeroFill();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BufferArea::zeroFill()
|
||||
{
|
||||
for(std::vector<Block>::const_iterator i = blocks.begin(); i != blocks.end(); ++i)
|
||||
{
|
||||
i->zeroFill();
|
||||
}
|
||||
}
|
||||
|
||||
void BufferArea::commit()
|
||||
{
|
||||
if (!safe)
|
||||
@@ -116,6 +143,20 @@ void BufferArea::commit()
|
||||
}
|
||||
}
|
||||
|
||||
void BufferArea::release()
|
||||
{
|
||||
for(std::vector<Block>::const_iterator i = blocks.begin(); i != blocks.end(); ++i)
|
||||
{
|
||||
i->cleanup();
|
||||
}
|
||||
blocks.clear();
|
||||
if (oneBuf)
|
||||
{
|
||||
fastFree(oneBuf);
|
||||
oneBuf = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//==================================================================================================
|
||||
|
||||
}} // cv::utils::
|
||||
|
||||
@@ -337,6 +337,21 @@ TEST_P(BufferArea, basic)
|
||||
ASSERT_TRUE(dbl_ptr != NULL);
|
||||
EXPECT_EQ((size_t)0, (size_t)int_ptr % sizeof(int));
|
||||
EXPECT_EQ((size_t)0, (size_t)dbl_ptr % sizeof(double));
|
||||
for (size_t i = 0; i < SZ; ++i)
|
||||
{
|
||||
int_ptr[i] = (int)i + 1;
|
||||
uchar_ptr[i] = (uchar)i + 1;
|
||||
dbl_ptr[i] = (double)i + 1;
|
||||
}
|
||||
area.zeroFill(int_ptr);
|
||||
area.zeroFill(uchar_ptr);
|
||||
area.zeroFill(dbl_ptr);
|
||||
for (size_t i = 0; i < SZ; ++i)
|
||||
{
|
||||
EXPECT_EQ((int)0, int_ptr[i]);
|
||||
EXPECT_EQ((uchar)0, uchar_ptr[i]);
|
||||
EXPECT_EQ((double)0, dbl_ptr[i]);
|
||||
}
|
||||
}
|
||||
EXPECT_TRUE(int_ptr == NULL);
|
||||
EXPECT_TRUE(uchar_ptr == NULL);
|
||||
|
||||
Reference in New Issue
Block a user