/*
 * Copyright (c) 2021 Arm Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef ARM_COMPUTE_ACL_ENTRYPOINTS_H_
#define ARM_COMPUTE_ACL_ENTRYPOINTS_H_

#include "arm_compute/AclTypes.h"

#ifdef __cplusplus
extern "C"
{
#endif /** __cplusplus */

    /** Create a context object
 *
 * Context is responsible for retaining internal information and work as an aggregate service mechanism
 *
 * @param[in, out] ctx     A valid non-zero context object if no failure occurs
 * @param[in]      target  Target to create the context for
 * @param[in]      options Context options to be used for all the kernels that are created under the context
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclOutOfMemory if there was a failure allocating memory resources
 *  - @ref AclUnsupportedTarget if the requested target is unsupported
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclCreateContext(AclContext *ctx, AclTarget target, const AclContextOptions *options);

    /** Destroy a given context object
 *
 * @param[in] ctx A valid context object to destroy
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if functions was completed successfully
 *  - @ref AclInvalidArgument if the provided context is invalid
 */
    AclStatus AclDestroyContext(AclContext ctx);

    /** Create an operator queue
 *
 * Queue is responsible for any scheduling related activities
 *
 * @param[in, out] queue   A valid non-zero queue object is not failures occur
 * @param[in]      ctx     Context to be used
 * @param[in]      options Queue options to be used for the operators using the queue
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclOutOfMemory if there was a failure allocating memory resources
 *  - @ref AclUnsupportedTarget if the requested target is unsupported
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclCreateQueue(AclQueue *queue, AclContext ctx, const AclQueueOptions *options);

    /** Wait until all elements on the queue have been completed
 *
 * @param[in] queue Queue to wait on completion
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if functions was completed successfully
 *  - @ref AclInvalidArgument if the provided queue is invalid
 *  - @ref AclRuntimeError on any other runtime related error
 */
    AclStatus AclQueueFinish(AclQueue queue);

    /** Destroy a given queue object
 *
 * @param[in] queue A valid context object to destroy
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if functions was completed successfully
 *  - @ref AclInvalidArgument if the provided context is invalid
 */
    AclStatus AclDestroyQueue(AclQueue queue);

    /** Create a Tensor object
 *
 * Tensor is a generalized matrix construct that can represent up to ND dimensionality (where N = 6 for Compute Library)
 * The object holds a backing memory along-side to operate on
 *
 * @param[in, out] tensor   A valid non-zero tensor object if no failures occur
 * @param[in]      ctx      Context to be used
 * @param[in]      desc     Tensor representation meta-data
 * @param[in]      allocate Instructs allocation of the tensor objects
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclOutOfMemory if there was a failure allocating memory resources
 *  - @ref AclUnsupportedTarget if the requested target is unsupported
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclCreateTensor(AclTensor *tensor, AclContext ctx, const AclTensorDescriptor *desc, bool allocate);

    /** Map a tensor's backing memory to the host
 *
 * @param[in]      tensor Tensor to be mapped
 * @param[in, out] handle A handle to the underlying backing memory
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclMapTensor(AclTensor tensor, void **handle);

    /** Unmap the tensor's backing memory
 *
 * @param[in] tensor tensor to unmap memory from
 * @param[in] handle Backing memory to be unmapped
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclUnmapTensor(AclTensor tensor, void *handle);

    /** Import external memory to a given tensor object
 *
 * @param[in, out] tensor Tensor to import memory to
 * @param[in]      handle Backing memory to be imported
 * @param[in]      type   Type of the imported memory
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclTensorImport(AclTensor tensor, void *handle, AclImportMemoryType type);

    /** Destroy a given tensor object
 *
 * @param[in,out] tensor A valid tensor object to be destroyed
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclInvalidArgument if the provided tensor is invalid
 */
    AclStatus AclDestroyTensor(AclTensor tensor);

    /** Creates a tensor pack
 *
 * Tensor packs are used to create a collection of tensors that can be passed around for operator execution
 *
 * @param[in,out] pack A valid non-zero tensor pack object if no failures occur
 * @param[in]     ctx  Context to be used
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclOutOfMemory if there was a failure allocating memory resources
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclCreateTensorPack(AclTensorPack *pack, AclContext ctx);

    /** Add a tensor to a tensor pack
 *
 * @param[in,out] pack    Pack to append a tensor to
 * @param[in]     tensor  Tensor to pack
 * @param[in]     slot_id Slot of the operator that the tensors corresponds to
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclOutOfMemory if there was a failure allocating memory resources
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclPackTensor(AclTensorPack pack, AclTensor tensor, int32_t slot_id);

    /** A list of tensors to a tensor pack
 *
 * @param[in,out] pack        Pack to append the tensors to
 * @param[in]     tensors     Tensors to append to the pack
 * @param[in]     slot_ids    Slot IDs of each tensors to the operators
 * @param[in]     num_tensors Number of tensors that are passed
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclOutOfMemory if there was a failure allocating memory resources
 *  - @ref AclInvalidArgument if a given argument is invalid
 */
    AclStatus AclPackTensors(AclTensorPack pack, AclTensor *tensors, int32_t *slot_ids, size_t num_tensors);

    /** Destroy a given tensor pack object
 *
 * @param[in,out] pack A valid tensor pack object to destroy
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if functions was completed successfully
 *  - @ref AclInvalidArgument if the provided context is invalid
 */
    AclStatus AclDestroyTensorPack(AclTensorPack pack);

    /** Eager execution of a given operator on a list of inputs and outputs
 *
 * @param[in]     op      Operator to execute
 * @param[in]     queue   Queue to schedule the operator on
 * @param[in,out] tensors A list of input and outputs tensors to execute the operator on
 *
 * @return Status Code
 *
 * Returns:
 *  - @ref AclSuccess if function was completed successfully
 *  - @ref AclOutOfMemory if there was a failure allocating memory resources
 *  - @ref AclUnsupportedTarget if the requested target is unsupported
 *  - @ref AclInvalidArgument if a given argument is invalid
 *  - @ref AclRuntimeError on any other runtime related error
 */
    AclStatus AclRunOperator(AclOperator op, AclQueue queue, AclTensorPack tensors);

    /** Destroy a given operator object
 *
 * @param[in,out] op A valid operator object to destroy
 *
 * @return Status code
 *
 * Returns:
 *  - @ref AclSuccess if functions was completed successfully
 *  - @ref AclInvalidArgument if the provided context is invalid
 */
    AclStatus AclDestroyOperator(AclOperator op);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* ARM_COMPUTE_ACL_ENTRYPOINTS_H_ */
