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

#include <armnn/backends/ICustomAllocator.hpp>

namespace armnn
{
struct Allocator
{
    /// Pointer to @ICustomAllocator.
    ICustomAllocator* m_CustomAllocator{};
    /// Value which the size of each buffer (actual data size + padding) has to be a multiple of.
    size_t m_Alignment = 0 ;
};

struct TensorMemory
{
    /// Number of bytes the value is away from the @BufferStorage.m_Buffer.
    size_t m_Offset{};
    /// Pointer to the tensor value.
    void* m_Data = nullptr;
    /// Identifier to be used by the @LoadedNetwork to order the tensors.
    unsigned int m_OutputSlotId{};
};

struct BufferStorage
{
    /// Vector of pointer to @TensorMemory.
    std::vector<TensorMemory*> m_TensorMemoryVector;
    /// Total size of the buffer.
    size_t m_BufferSize;
    /// Pointer to the first element of the buffer.
    void* m_Buffer = nullptr;
};

class MemoryManager
{
public:
    /// Initialization method to store in @m_AllocatorBufferStoragePairVector all information needed.
    /// @param[in] bufferStorageVector - Vector of @BufferStorage.
    /// @param[in] customAllocator - Pointer to @ICustomAllocator.
    /// @param[in] typeAlignment - Optional parameter. Value of which the size of each value has to be multiple of.
    void StoreMemToAllocate(std::vector<BufferStorage> bufferStorageVector,
                            ICustomAllocator* customAllocator,
                            size_t typeAlignment = 0);

    /// Allocate the amount of memory indicated by @m_BufferSize, and
    /// point each @m_Data to each correspondent Tensor so that they are @m_Offset bytes separated.
    void Allocate();

    /// Deallocate memory
    void Deallocate();

private:
    std::vector<std::pair<Allocator, std::vector<BufferStorage>>> m_AllocatorBufferStoragePairVector;
};

} // namespace armnn
