You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							244 lines
						
					
					
						
							5.8 KiB
						
					
					
				
			
		
		
	
	
							244 lines
						
					
					
						
							5.8 KiB
						
					
					
				| //==============================================================================
 | |
| //
 | |
| // Copyright (c) 2016 Qualcomm Technologies, Inc.
 | |
| // All Rights Reserved.
 | |
| // Confidential and Proprietary - Qualcomm Technologies, Inc.
 | |
| //
 | |
| //==============================================================================
 | |
| 
 | |
| #ifndef UDL_CONTEXT_HPP
 | |
| #define UDL_CONTEXT_HPP
 | |
| 
 | |
| #include <cstring> // memset
 | |
| #include <tuple>
 | |
| 
 | |
| #include "ZdlExportDefine.hpp"
 | |
| 
 | |
| namespace zdl { namespace DlSystem {
 | |
| /** @addtogroup c_plus_plus_apis C++
 | |
| @{ */
 | |
| 
 | |
| /**
 | |
|  * @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<uint8_t*, size_t> cpy = ctx.getCopy();
 | |
|       // current compiler does not support get<type>
 | |
|       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<uint8_t*, size_t> 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;
 | |
| };
 | |
| /** @} */ /* end_addtogroup c_plus_plus_apis C++ */
 | |
| 
 | |
| }}
 | |
| 
 | |
| #endif /* UDL_CONTEXT_HPP */
 | |
| 
 |