//============================================================================== // // Copyright (c) 2016-2021 Qualcomm Technologies, Inc. // All Rights Reserved. // Confidential and Proprietary - Qualcomm Technologies, Inc. // //============================================================================== #ifndef UDL_CONTEXT_HPP #define UDL_CONTEXT_HPP #include // memset #include #include "ZdlExportDefine.hpp" namespace zdl { namespace DlSystem { /** * NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE. * * @brief . * * UDLContext holds the user defined layer context which * consists of a layer name, layer ID, blob and blob size. * * An instance of UDLContext is passed as an argument to the * UDLFactoryFunc provided by the user every time the SNPE * runtime encounters an unknown layer descriptor. The instance * of a UDLContext is created by the SNPE runtime and is * consumed by the user's factory function. The user should * obtain a copy of this class and should not assume any * prolonged object lifetime beyond the UDLFactoryFunction. */ class ZDL_EXPORT UDLContext final { public: /** * @brief Constructor * * @param[in] name name of the layer * * @param[in] type layer type * * @param[in] id identifier for the layer * * @param[in] id Blob/bytes as packed by the user code as part of * the Python converter script */ UDLContext(const std::string& name, const std::string& type, int32_t id, const std::string& blob) : m_Name(name), m_Type(type), m_Size(blob.size()), m_Id(id) { // FIXME not dealing with alloc error m_Buffer = new uint8_t[m_Size]; std::memcpy(m_Buffer, blob.data(), m_Size); } /** * @brief . * * Empty constructor is useful for * creating an empty UDLContext and then run copy constructor * from a fully initialized one. */ explicit UDLContext() {} /** * @brief . * * destructor Deallocates any internal allocated memory */ ~UDLContext() { release(); } /** * @brief . * * Deallocate any internally allocated memory */ void release() { if (m_Buffer && m_Size) std::memset(m_Buffer, 0, m_Size); delete []m_Buffer; m_Buffer = nullptr; m_Size = 0; } /** * @brief . * * Copy Constructor - makes a copy from ctx * * @param[in] ctx Source UDLContext to copy from */ UDLContext(const UDLContext& ctx) : m_Name(ctx.m_Name), m_Type(ctx.m_Type), m_Id(ctx.m_Id) { std::tuple cpy = ctx.getCopy(); // current compiler does not support get m_Buffer = std::get<0>(cpy); m_Size = std::get<1>(cpy); } /** * @brief * * Assignment operator - makes a copy from ctx * * @param[in] ctx Source UDLContext to copy from * * @return this */ UDLContext& operator=(const UDLContext& ctx) { UDLContext c (ctx); this->swap(c); // non throwing swap return *this; } /** * @brief . * * Move Constructor - Move internals from ctx into this * * @param[in] ctx Source UDLContext to move from */ UDLContext(UDLContext&& ctx) : m_Name(std::move(ctx.m_Name)), m_Type(std::move(ctx.m_Type)), m_Buffer(ctx.m_Buffer), m_Size(ctx.m_Size), m_Id(ctx.m_Id) { ctx.clear(); } /** * @brief . * * Assignment move - Move assignment operator from ctx * * @param[in] ctx Source UDLContext to move from * * @return this */ UDLContext& operator=(UDLContext&& ctx) { m_Name = std::move(ctx.m_Name); m_Type = std::move(ctx.m_Type); m_Buffer = ctx.m_Buffer; m_Size = ctx.m_Size; m_Id = ctx.m_Id; ctx.clear(); return *this; } /** * @brief . * * Obtain the name of the layer * * @return const reference to the name of the layer */ const std::string& getName() const noexcept { return m_Name; } /** * @brief . * * Obtain the type of the layer * * @return const reference to the type of the layer */ const std::string& getType() const noexcept { return m_Type; } /** * @brief . * * Obtain the Id of the layer * * @return The id of the layer */ int32_t getId() const noexcept { return m_Id; } /** * @brief . * * Obtain the size of the blob * * @return Size of the internal blob */ size_t getSize() const noexcept { return m_Size; } /** * @brief . * * Get a const pointer to the internal blob * * @return Const pointer to the internal blob */ const uint8_t* getBlob() const noexcept { return m_Buffer; } /** * @brief . * * Get a copy of the blob/size into a tuple * * @return A tuple with a pointer to a copy of the blob and a * size */ std::tuple getCopy() const { uint8_t* buf = new uint8_t[m_Size]; // FIXME missing memcpy std::memcpy(buf, m_Buffer, m_Size); return std::make_tuple(buf, m_Size); } /** * @brief . * * Set zeros in the internals members */ void clear() { m_Name.clear(); m_Type.clear(); m_Buffer = 0; m_Size = 0; m_Id = -1; } private: void swap(UDLContext& c) noexcept { std::swap(m_Name, c.m_Name); std::swap(m_Type, c.m_Type); std::swap(m_Id, c.m_Id); std::swap(m_Buffer, c.m_Buffer); std::swap(m_Size, c.m_Size); } std::string m_Name; // name of the layer instance std::string m_Type; // The actual layer type uint8_t* m_Buffer = nullptr; size_t m_Size = 0; int32_t m_Id = -1; }; }} #endif /* UDL_CONTEXT_HPP */