/*
 * Copyright (c) 2018 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_GRAPH_BACKENDS_UTILS_H__
#define __ARM_COMPUTE_GRAPH_BACKENDS_UTILS_H__

#include "arm_compute/graph/GraphContext.h"
#include "arm_compute/runtime/IMemoryManager.h"

namespace arm_compute
{
namespace graph
{
namespace backends
{
/** Creates and configures a named function
 *
 * @param[in] name Name of the function
 * @param[in] args Function arguments
 *
 * @return  A configured backend function
 */
template <typename FunctionType, typename FunctionNameType, typename... ParameterType>
std::pair<std::unique_ptr<arm_compute::IFunction>, FunctionNameType> create_named_function(FunctionNameType name, ParameterType... args)
{
    auto f = arm_compute::support::cpp14::make_unique<FunctionType>();
    f->configure(std::forward<ParameterType>(args)...);
    return std::make_pair(std::move(f), name);
}

/** Creates and configures a named function
 *
 * @param[in] name Name of the function
 * @param[in] mm   Memory manager to use
 * @param[in] args Function arguments
 *
 * @return  A configured backend function
 */
template <typename FunctionType, typename FunctionNameType, typename MemoryManagerType, typename... ParameterType>
std::pair<std::unique_ptr<arm_compute::IFunction>, FunctionNameType> create_named_memory_managed_function(FunctionNameType name,
                                                                                                          MemoryManagerType mm,
                                                                                                          ParameterType... args)
{
    auto f = arm_compute::support::cpp14::make_unique<FunctionType>(mm);
    f->configure(std::forward<ParameterType>(args)...);
    return std::make_pair(std::move(f), name);
}

/** Checks if an operation is in place
 *
 * @param[in] input  Pointer to input
 * @param[in] output Pointer to output
 *
 * @return True if output is nullptr or input is equal to the output, else false
 */
inline bool is_in_place_operation(void *input, void *output)
{
    return (output == nullptr) || (input == output);
}

/** Returns the memory manager for a given target
 *
 * @param[in] ctx    Graph context containing memory management metadata
 * @param[in] target Target to retrieve the memory manager from
 *
 * @return The memory manager for the given target else false
 */
inline std::shared_ptr<IMemoryManager> get_memory_manager(GraphContext &ctx, Target target)
{
    bool enabled = ctx.config().use_function_memory_manager && (ctx.memory_management_ctx(target) != nullptr);
    return enabled ? ctx.memory_management_ctx(target)->intra_mm : nullptr;
}
} // namespace backends
} // namespace graph
} // namespace arm_compute

#endif /* __ARM_COMPUTE_GRAPH_BACKENDS_UTILS_H__ */
