//
// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once

#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
#include "MemoryOptimizerStrategyFactory.hpp"
#include <algorithm>

#include "strategies/ConstantMemoryStrategy.hpp"
#include "strategies/StrategyValidator.hpp"

namespace
{
// Default Memory Optimizer Strategies
static const std::vector<std::string> memoryOptimizationStrategies(
{
    "ConstantMemoryStrategy",
    "StrategyValidator"
});

#define CREATE_MEMORY_OPTIMIZER_STRATEGY(strategyName, memoryOptimizerStrategy)                                  \
{                                                                                                                \
    MemoryOptimizerStrategyFactory memoryOptimizerStrategyFactory;                                               \
    memoryOptimizerStrategy = memoryOptimizerStrategyFactory.CreateMemoryOptimizerStrategy<strategyName>();      \
}                                                                                                                \

} // anonymous namespace
namespace armnn
{
    std::unique_ptr<IMemoryOptimizerStrategy> GetMemoryOptimizerStrategy(const std::string& strategyName)
    {
        auto doesStrategyExist = std::find(memoryOptimizationStrategies.begin(),
                                           memoryOptimizationStrategies.end(),
                                           strategyName) != memoryOptimizationStrategies.end();
        if (doesStrategyExist)
        {
            std::unique_ptr<IMemoryOptimizerStrategy> memoryOptimizerStrategy = nullptr;
            CREATE_MEMORY_OPTIMIZER_STRATEGY(armnn::ConstantMemoryStrategy,
                                             memoryOptimizerStrategy);
            return  memoryOptimizerStrategy;
        }
        return nullptr;
    }


    const std::vector<std::string>& GetMemoryOptimizerStrategyNames()
    {
        return memoryOptimizationStrategies;
    }
} // namespace armnn