+ /**
+ * @brief Remove a texture matching id.
+ * Erase the observer from the observer list of cache if we need.
+ * This API decrease cached NPatchInfo reference.
+ * If the NPatchInfo reference become 0, the textureSet will be reset.
+ *
+ * @param [in] id cache data id
+ * @param [in] textureObserver The NPatchVisual that requested loading.
+ */
+ void Remove(std::size_t id, TextureUploadObserver* textureObserver);
+
+private:
+ NPatchData::NPatchDataId GenerateUniqueNPatchDataId();
+
+ int32_t GetCacheIndexFromId(const NPatchData::NPatchDataId id);
+
+private:
+ /**
+ * @brief Information of NPatchData
+ * It also hold ownership of NPatchData memory.
+ */
+ struct NPatchInfo
+ {
+ NPatchInfo(NPatchData* data)
+ : mData(data),
+ mReferenceCount(1u)
+ {
+ }
+ ~NPatchInfo()
+ {
+ if(mData)
+ {
+ delete mData;
+ }
+ }
+ NPatchInfo(NPatchInfo&& info) // move constructor
+ {
+ mData = std::move(info.mData);
+ mReferenceCount = info.mReferenceCount;
+ info.mData = nullptr;
+ info.mReferenceCount = 0u;
+ }
+ NPatchInfo& operator=(NPatchInfo&& info) // move operator
+ {
+ mData = std::move(info.mData);
+ mReferenceCount = info.mReferenceCount;
+ info.mData = nullptr;
+ info.mReferenceCount = 0u;
+ return *this;
+ }
+
+ NPatchInfo() = delete; // Do not use default constructor
+ NPatchInfo(const NPatchInfo& info) = delete; // Do not use copy constructor
+
+ NPatchData* mData;
+ std::int16_t mReferenceCount; ///< The number of N-patch visuals that use this data.
+ };