diff --git a/include/aidge/backend/opencv/data/TensorImpl.hpp b/include/aidge/backend/opencv/data/TensorImpl.hpp index c0689ed85c28f3e69d862147892fabb3226ae06f..019fb91f93097d9a98f4b9c697f9a57b4a08c2b7 100644 --- a/include/aidge/backend/opencv/data/TensorImpl.hpp +++ b/include/aidge/backend/opencv/data/TensorImpl.hpp @@ -90,14 +90,20 @@ public: // native interface const cv::Mat & data() const override { return mData; } + inline std::size_t capacity() const noexcept override { return (mData.total() * mData.channels()); } + inline std::size_t scalarSize() const noexcept override final { return sizeof(T); } + void zeros() override final { + mData.setTo(cv::Scalar::all(T(0))); + } + void copy(const void *src, NbElts_t length, NbElts_t offset = 0) override final { const T* srcT = static_cast<const T *>(src); T* dstT = static_cast<T *>(rawPtr(offset)); - AIDGE_ASSERT(length <= (mData.total() * mData.channels()) || length <= mNbElts, "copy length is above capacity"); - AIDGE_ASSERT(dstT < srcT || dstT >= srcT + length, "overlapping copy is not supported"); + AIDGE_ASSERT(length <= (mData.total() * mData.channels()) || length <= mNbElts, "TensorImpl_opencv<{}>::copy(): copy length ({}) is above capacity ({})", typeid(T).name(), length, mNbElts); + AIDGE_ASSERT(dstT < srcT || dstT >= srcT + length, "TensorImpl_opencv<{}>::copy(): overlapping copy is not supported", typeid(T).name()); std::copy(srcT, srcT + length, dstT); } @@ -108,7 +114,7 @@ public: } T* dstT = static_cast<T *>(rawPtr(offset)); - AIDGE_ASSERT(length <= (mData.total() * mData.channels()) || length <= mNbElts, "copy length is above capacity"); + AIDGE_ASSERT(length <= (mData.total() * mData.channels()) || length <= mNbElts, "TensorImpl_opencv<{}>::copyCast(): copy length ({}) is above capacity ({})", typeid(T).name(), length, mNbElts); switch (srcDt) { case DataType::Float64: @@ -156,15 +162,15 @@ public: dstT); break; default: - AIDGE_THROW_OR_ABORT(std::runtime_error, "Unsupported data type."); + AIDGE_THROW_OR_ABORT(std::runtime_error, "TensorImpl_opencv<{}>::copyCast(): unsupported data type {}.", typeid(T).name(), srcDt); break; } } void copyFromDevice(const void *src, const std::pair<std::string, DeviceIdx_t>& device, NbElts_t length, NbElts_t offset = 0) override final { - AIDGE_ASSERT(device.first == Backend, "backend must match"); - AIDGE_ASSERT(device.second == 0, "device cannot be != 0 for CPU backend"); + AIDGE_ASSERT(device.first == Backend, "TensorImpl_opencv<{}>::copyFromDevice(): backend must match", typeid(T).name()); + AIDGE_ASSERT(device.second == 0, "TensorImpl_opencv<{}>::copyFromDevice(): device ({}) cannot be != 0 for CPU backend", typeid(T).name(), device.second); copy(src, length, offset); } @@ -174,7 +180,7 @@ public: void copyToHost(void *dst, NbElts_t length, NbElts_t offset = 0) const override final { const T* src = static_cast<const T*>(rawPtr(offset)); - AIDGE_ASSERT(length <= (mData.total() * mData.channels()) || length <= mNbElts, "copy length is above capacity"); + AIDGE_ASSERT(length <= (mData.total() * mData.channels()) || length <= mNbElts, "TensorImpl_opencv<{}>::copyToHost(): copy length ({}) is above capacity ({})", typeid(T).name(), length, mNbElts); std::copy(src, src + length, static_cast<T *>(dst)); } @@ -184,7 +190,7 @@ public: }; const void *rawPtr(NbElts_t offset = 0) const override final { - AIDGE_ASSERT((mData.total() * mData.channels()) >= mNbElts, "accessing uninitialized const rawPtr"); + AIDGE_ASSERT((mData.total() * mData.channels()) >= mNbElts, "TensorImpl_opencv<{}>::rawPtr(): accessing uninitialized const rawPtr", typeid(T).name()); return (mData.ptr<T>() + offset); }; @@ -194,8 +200,8 @@ public: }; const void *hostPtr(NbElts_t offset = 0) const override { - AIDGE_ASSERT((mData.total() * mData.channels()) >= mNbElts, "accessing uninitialized const hostPtr"); - AIDGE_ASSERT(mData.isContinuous(), "CV Matrix not continuous"); + AIDGE_ASSERT((mData.total() * mData.channels()) >= mNbElts, "TensorImpl_opencv<{}>::hostPtr(): accessing uninitialized const hostPtr", typeid(T).name()); + AIDGE_ASSERT(mData.isContinuous(), "TensorImpl_opencv<{}>::hostPtr(): CV Matrix not continuous", typeid(T).name()); return (mData.ptr<T>() + offset); }; @@ -209,7 +215,7 @@ private: void lazyInit() { if ((mData.total() * mData.channels()) < mNbElts) { // Need more data, a re-allocation will occur - AIDGE_ASSERT(mData.empty() , "trying to enlarge non-owned data"); + AIDGE_ASSERT(mData.empty(), "TensorImpl_opencv<{}>: trying to enlarge non-owned data", typeid(T).name()); if (mDims.size() < 3) { mData = cv::Mat(((mDims.size() > 1) ? static_cast<int>(mDims[0])