diff --git a/src/mat.cpp b/src/mat.cpp index 1e92f8039..eaeb8c5b1 100644 --- a/src/mat.cpp +++ b/src/mat.cpp @@ -33,32 +33,6 @@ namespace ncnn { -Mat& Mat::operator=(const Mat& m) -{ - if (this == &m) - return *this; - - if (m.refcount) - NCNN_XADD(m.refcount, 1); - - release(); - - data = m.data; - refcount = m.refcount; - elemsize = m.elemsize; - elempack = m.elempack; - allocator = m.allocator; - - dims = m.dims; - w = m.w; - h = m.h; - c = m.c; - - cstep = m.cstep; - - return *this; -} - Mat Mat::clone(Allocator* _allocator) const { if (empty()) @@ -408,64 +382,7 @@ void Mat::create_like(const VkImageMat& im, Allocator* _allocator) } #endif // NCNN_VULKAN -void Mat::addref() -{ - if (refcount) - NCNN_XADD(refcount, 1); -} - -void Mat::release() -{ - if (refcount && NCNN_XADD(refcount, -1) == 1) - { - if (allocator) - allocator->fastFree(data); - else - fastFree(data); - } - - data = 0; - - elemsize = 0; - elempack = 0; - - dims = 0; - w = 0; - h = 0; - c = 0; - - cstep = 0; - - refcount = 0; -} - #if NCNN_VULKAN -VkMat& VkMat::operator=(const VkMat& m) -{ - if (this == &m) - return *this; - - if (m.refcount) - NCNN_XADD(m.refcount, 1); - - release(); - - data = m.data; - refcount = m.refcount; - elemsize = m.elemsize; - elempack = m.elempack; - allocator = m.allocator; - - dims = m.dims; - w = m.w; - h = m.h; - c = m.c; - - cstep = m.cstep; - - return *this; -} - void VkMat::create(int _w, size_t _elemsize, VkAllocator* _allocator) { if (dims == 1 && w == _w && elemsize == _elemsize && elempack == 1 && allocator == _allocator) @@ -673,61 +590,6 @@ void VkMat::create_like(const VkImageMat& im, VkAllocator* _allocator) create(im.w, im.h, im.c, im.elemsize, im.elempack, _allocator); } -void VkMat::addref() -{ - if (refcount) - NCNN_XADD(refcount, 1); -} - -void VkMat::release() -{ - if (refcount && NCNN_XADD(refcount, -1) == 1) - { - if (allocator && data) - { - allocator->fastFree(data); - } - } - - data = 0; - - elemsize = 0; - elempack = 0; - - dims = 0; - w = 0; - h = 0; - c = 0; - - cstep = 0; - - refcount = 0; -} - -VkImageMat& VkImageMat::operator=(const VkImageMat& m) -{ - if (this == &m) - return *this; - - if (m.refcount) - NCNN_XADD(m.refcount, 1); - - release(); - - data = m.data; - refcount = m.refcount; - elemsize = m.elemsize; - elempack = m.elempack; - allocator = m.allocator; - - dims = m.dims; - w = m.w; - h = m.h; - c = m.c; - - return *this; -} - void VkImageMat::create(int _w, size_t _elemsize, VkAllocator* _allocator) { if (dims == 1 && w == _w && elemsize == _elemsize && elempack == 1 && allocator == _allocator) @@ -922,35 +784,6 @@ void VkImageMat::create_like(const VkImageMat& im, VkAllocator* _allocator) if (_dims == 3) create(im.w, im.h, im.c, im.elemsize, im.elempack, _allocator); } - -void VkImageMat::addref() -{ - if (refcount) - NCNN_XADD(refcount, 1); -} - -void VkImageMat::release() -{ - if (refcount && NCNN_XADD(refcount, -1) == 1) - { - if (allocator && data) - { - allocator->fastFree(data); - } - } - - data = 0; - - elemsize = 0; - elempack = 0; - - dims = 0; - w = 0; - h = 0; - c = 0; - - refcount = 0; -} #endif // NCNN_VULKAN void Mat::substract_mean_normalize(const float* mean_vals, const float* norm_vals) diff --git a/src/mat.h b/src/mat.h index 11fb9682e..e623cabf7 100644 --- a/src/mat.h +++ b/src/mat.h @@ -960,6 +960,63 @@ inline void Mat::fill(T _v) } } +inline Mat& Mat::operator=(const Mat& m) +{ + if (this == &m) + return *this; + + if (m.refcount) + NCNN_XADD(m.refcount, 1); + + release(); + + data = m.data; + refcount = m.refcount; + elemsize = m.elemsize; + elempack = m.elempack; + allocator = m.allocator; + + dims = m.dims; + w = m.w; + h = m.h; + c = m.c; + + cstep = m.cstep; + + return *this; +} + +inline void Mat::addref() +{ + if (refcount) + NCNN_XADD(refcount, 1); +} + +inline void Mat::release() +{ + if (refcount && NCNN_XADD(refcount, -1) == 1) + { + if (allocator) + allocator->fastFree(data); + else + fastFree(data); + } + + data = 0; + + elemsize = 0; + elempack = 0; + + dims = 0; + w = 0; + h = 0; + c = 0; + + cstep = 0; + + refcount = 0; +} + inline bool Mat::empty() const { return data == 0 || total() == 0; @@ -1163,6 +1220,32 @@ inline VkMat::~VkMat() release(); } +inline VkMat& VkMat::operator=(const VkMat& m) +{ + if (this == &m) + return *this; + + if (m.refcount) + NCNN_XADD(m.refcount, 1); + + release(); + + data = m.data; + refcount = m.refcount; + elemsize = m.elemsize; + elempack = m.elempack; + allocator = m.allocator; + + dims = m.dims; + w = m.w; + h = m.h; + c = m.c; + + cstep = m.cstep; + + return *this; +} + inline Mat VkMat::mapped() const { if (!allocator->mappable) @@ -1188,6 +1271,37 @@ inline void* VkMat::mapped_ptr() const return (unsigned char*)data->mapped_ptr + data->offset; } +inline void VkMat::addref() +{ + if (refcount) + NCNN_XADD(refcount, 1); +} + +inline void VkMat::release() +{ + if (refcount && NCNN_XADD(refcount, -1) == 1) + { + if (allocator && data) + { + allocator->fastFree(data); + } + } + + data = 0; + + elemsize = 0; + elempack = 0; + + dims = 0; + w = 0; + h = 0; + c = 0; + + cstep = 0; + + refcount = 0; +} + inline bool VkMat::empty() const { return data == 0 || total() == 0; @@ -1312,6 +1426,30 @@ inline VkImageMat::~VkImageMat() release(); } +inline VkImageMat& VkImageMat::operator=(const VkImageMat& m) +{ + if (this == &m) + return *this; + + if (m.refcount) + NCNN_XADD(m.refcount, 1); + + release(); + + data = m.data; + refcount = m.refcount; + elemsize = m.elemsize; + elempack = m.elempack; + allocator = m.allocator; + + dims = m.dims; + w = m.w; + h = m.h; + c = m.c; + + return *this; +} + inline Mat VkImageMat::mapped() const { if (!allocator->mappable || !data->mapped_ptr) @@ -1337,6 +1475,35 @@ inline void* VkImageMat::mapped_ptr() const return (unsigned char*)data->mapped_ptr + data->bind_offset; } +inline void VkImageMat::addref() +{ + if (refcount) + NCNN_XADD(refcount, 1); +} + +inline void VkImageMat::release() +{ + if (refcount && NCNN_XADD(refcount, -1) == 1) + { + if (allocator && data) + { + allocator->fastFree(data); + } + } + + data = 0; + + elemsize = 0; + elempack = 0; + + dims = 0; + w = 0; + h = 0; + c = 0; + + refcount = 0; +} + inline bool VkImageMat::empty() const { return data == 0 || total() == 0;