//
// Copyright © 2023 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include <armnn_delegate.hpp>

namespace {

    TfLiteOpaqueDelegate* ArmNNDelegateCreateFunc(const void* tflite_settings)
    {
        armnnDelegate::DelegateOptions opt = armnnOpaqueDelegate::ParseArmNNSettings(
                static_cast<const tflite::TFLiteSettings*>(tflite_settings));

        auto delegate = armnnOpaqueDelegate::TfLiteArmnnOpaqueDelegateCreate(opt);
        return delegate;
    }

    void ArmNNDelegateDestroyFunc(TfLiteOpaqueDelegate* armnnDelegate)
    {
        armnnOpaqueDelegate::TfLiteArmnnOpaqueDelegateDelete(
                armnnDelegate);
    }

    int ArmNNDelegateErrnoFunc(TfLiteOpaqueDelegate* sample_stable_delegate)
    {
        return 0;
    }

    const TfLiteOpaqueDelegatePlugin armnn_delegate_plugin = {
            ArmNNDelegateCreateFunc, ArmNNDelegateDestroyFunc,
            ArmNNDelegateErrnoFunc};

    const TfLiteStableDelegate armnn_delegate = {
            /*delegate_abi_version=*/ TFL_STABLE_DELEGATE_ABI_VERSION,
            /*delegate_name=*/        "armnn_delegate",
            /*delegate_version=*/     OPAQUE_DELEGATE_VERSION,
            /*delegate_plugin=*/      &armnn_delegate_plugin
    };

}  // namespace

/**
 * The ArmNN delegate to be loaded dynamically
 */
extern "C" const TfLiteStableDelegate TFL_TheStableDelegate = armnn_delegate;