draw class diagram class R_EXFWK
{
public:
    /*******************************************************************************************************************
     * \fn R_EXFWK
     * \brief Constructor
     * \param [in] exfwk_multiprocess_type
     * \return R_EXFWK instance
     ******************************************************************************************************************/
    R_EXFWK(const e_exfwk_multiprocess_type_t exfwk_multiprocess_type = EXFWK_SINGLE_PROCESS);

    /**
     * @brief initialize the exfwk
     * @param [in] exfwk_json_file_name: Path to json file with EXFWK OSAL resources configuration.
     * @param [in] manager: Pointer to BufMgr_BufferManager object.
     * @param [in] comal_json_file_name: Path to json file with Comal configuration. Default value is an empty string.
     * @return Return value
     * @retval R_RETURN_EXFWK_OK Success completion.
     * @retval RETURN_EXFWK_ERROR_INVALID_JSON_CONFIG  if the JSON doesn't contain the expected elements (see
     * README.md).
     * @retval RETURN_EXFWK_ERROR_NOT_INIT if an internal error occurs during execution and the internal elements
     *         couldn't be initialized.
     * @retval RETURN_EXFWK_ERROR_STATE if the function is called when the EXFWK is already initialized.
     */
    e_exfwk_return_t exfwk_init(const std::string & exfwk_json_file_name, BufMgr_BufferManager* manager,
                                const std::string & comal_json_file_name = std::string(""));

    /**
     * @brief initialize the exfwk
     * @param [in] exfwk_json_contents: String that defines the EXFWK OSAL resource configuration in JSON format.
     * @param [in] manager: Pointer to BufMgr_BufferManager object.
     * @param [in] comal_json_contents: String that defines the Comal configuration in JSON format. Default value is an empty string.
     * @return Return value
     * @retval R_RETURN_EXFWK_OK Success completion.
     * @retval RETURN_EXFWK_ERROR_NOT_INIT if an internal error occurs during execution and the internal elements
     *         couldn't be initialized.
     * @retval RETURN_EXFWK_ERROR_STATE if the function is called when the EXFWK is already initialized.
     * @retval RETURN_EXFWK_ERROR_INVALID_PARAM if a parameter is invalid. (The parameters set in the constructor
     *         and this API are out of range.)
     * @note in addition to the error code returned by this function, a runtime_error exception can be thrown at any
     * point during runtime of the exfwk from any thread used by the exfwk. This error indicates that the fatal_error
     * callback function has been called from other layers in the sw. Exfwk cannot recover from this error and the
     * program must be terminated in case it would be thrown.
     */
    e_exfwk_return_t exfwk_init_by_json_string(const std::string & exfwk_json_contents, BufMgr_BufferManager* manager,
                                               const std::string & comal_json_contents = std::string(""));
    /**
     * @brief deinitialize the exfwk
     * @return           Return value
     * @retval           R_RETURN_EXFWK_OK                   Success completion.
     */
    e_exfwk_return_t exfwk_quit();

    /*******************************************************************************************************************
     * \fn push
     * \brief push a job container for execution.
     * \param [in] job_container: job container instance to be pushed.
     * \param [in] priority: priority of job container
     * \param [in] cbinfo: Structure for setting parameters for the callback that notifies event related to the container
     * \param [out] container_id: unique identifier of the container, set by the server
     * \return e_exfwk_return_t
     * \retval RETURN_EXFWK_OK if all went well
     * \retval RETURN_EXFWK_ERROR_NOT_INIT if exfwk is not initialized
     * \retval RETURN_EXFWK_ERROR_INVALID_PARAM if a parameter is invalid (pointer for container id not
     *      initialized , empty container )
     * \retval RETURN_EXFWK_ERROR_COMAL          if an error occurred while trying to communicate through COMAL
     *      with the server (client implementation)
     * \retval RETURN_EXFWK_IMPX_INVALID_PARAM   if the parameters for the IMP are not properly set
     * \retval RETURN_EXFWK_ERROR_ALLOC          if the exfwk cannot allocate memory
     * \retval RETURN_EXFWK_IMPX_SYSTEMERROR     System error(OSAL error)
     * \retval RETURN_EXFWK_IMPX_SEQSTATE        IMPX API call does not follow state transition
     * \retval RETURN_EXFWK_TIMEOUT              Timeout error
     ******************************************************************************************************************/
    e_exfwk_return_t push(const JobContainer & job_container,
                          const uint8_t priority,
                          const s_exfwk_container_cbinfo_t & cbinfo,
                          uint32_t & container_id);

    e_exfwk_return_t init_dsp(const hwahd::st_core_info_t & core_info, const hwahd::st_dsp_config_t & dsp_config);
    e_exfwk_return_t init_udf(const hwahd::st_core_info_t & core_info, const hwahd::udf::st_udf_config_t & udf_config);

    /*******************************************************************************************************************
     * \fn version
     * \brief Returns the current execution framework version
     * \return st_exfwk_version_t
     ******************************************************************************************************************/
    const static st_exfwk_version_t version(void) noexcept;

private:
    e_exfwk_multiprocess_type_t  m_exfwk_multiprocess_type;
    ExecutionFrameworkInternal * m_internal;
    /* static boolean to determine EXFWK state: Initialized or not */
    static bool m_is_init_b;

    /*******************************************************************************************************************
     * \fn prv_stc_is_initialized
     * \brief Private static method get current state of R_EXFWK.
     * \param None
     * \return boolean
     * \retval true if R_EXFWK is already initialized.
     * \retval false if R_EXFWK is not initialized yet.
     ******************************************************************************************************************/
    static bool prv_stc_is_initialized();

    /*******************************************************************************************************************
     * \fn prv_stc_set_initialized
     * \brief Private static method to set R_EXFWK state to initialized.
     * \param None
     * \return None
     ******************************************************************************************************************/
    static void prv_stc_set_initialized();
    /*******************************************************************************************************************
     * \fn prv_stc_set_closed
     * \brief Private static method to set R_EXFWK state to not initialized (equivalent to closed).
     * \param None
     * \return None
     ******************************************************************************************************************/
    static void prv_stc_set_closed();
};