//==============================================================================
//
// 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 <cstring> // memset
# include <tuple>
# 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 < 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 ;
} ;
} }
# endif /* UDL_CONTEXT_HPP */