//==============================================================================
//
//  Copyright (c) 2015-2021 Qualcomm Technologies, Inc.
//  All Rights Reserved.
//  Confidential and Proprietary - Qualcomm Technologies, Inc.
//
//==============================================================================

#ifndef _UDL_FUNC_HPP_
#define _UDL_FUNC_HPP_

#include <functional>

#include "ZdlExportDefine.hpp"
#include <DlSystem/IUDL.hpp>

namespace zdl {
    namespace DlSystem {
        class UDLContext;
    }
}

namespace zdl { namespace DlSystem {
/**
 * NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
 *
 * @brief .
 *
 * Definition of UDLFactoyFunc, using/typedef and default FactoryFunction
 * UDLBundle - a simple way to bundle func and cookie into one type
 */


/**
 * @brief .
 * 
 * Convenient typedef for user defined layer creation factory
 *
 * @param[out] void* Cookie - a user opaque data that was passed during SNPE's runtime's
 *        CreateInstance. SNPE's runtime is passing this back to the user.
 *
 * @param[out] DlSystem::UDLContext* - The specific Layer Description context what is passe
 *        SNPE runtime.
 *
 * @return IUDL* - a Concrete instance of IUDL derivative
 */
using UDLFactoryFunc = std::function<zdl::DlSystem::IUDL* (void*, const zdl::DlSystem::UDLContext*)>;

/**
 * NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
 *
 * @brief .
 *
 * default UDL factory implementation
 *
 * @param[out] DlSystem::UDLContext* - The specific Layer Description context what is passe
 *        SNPE runtime.
 *
 * @param[out] void* Cookie - a user opaque data that was passed during SNPE's runtime's
 *        CreateInstance. SNPE's runtime is passing this back to the user.
 * 
 * @return IUDL* - nullptr to indicate SNPE's runtime that there is no specific
 *         implementation for UDL. When SNPE's runtime sees nullptr as a return
 *         value from the factory, it will halt execution if model has an unknown layer
 *
 */
inline ZDL_EXPORT zdl::DlSystem::IUDL* DefaultUDLFunc(void*, const zdl::DlSystem::UDLContext*) { return nullptr; }

/**
 * NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
 *
 * @brief .
 * 
 * Simple struct to bundle 2 elements.
 * A user defined cookie that would be returned for each
 * IUDL call. The user can place anything there and the
 * SNPE runtime will provide it back
 */
struct ZDL_EXPORT UDLBundle {
   void          *cookie = nullptr;
   UDLFactoryFunc func   = DefaultUDLFunc;
};

}}


#endif // _UDL_FUNC_HPP_