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

#include "armnn/BackendId.hpp"
#include <map>

namespace arm
{
namespace pipe
{

class ICounterMappings
{
public:
    virtual uint16_t GetGlobalId(uint16_t backendCounterId, const armnn::BackendId& backendId) const = 0;
    virtual const std::pair<uint16_t, armnn::BackendId>& GetBackendId(uint16_t globalCounterId) const = 0;
    virtual ~ICounterMappings() {}
};

class IRegisterCounterMapping
{
public:
    virtual void RegisterMapping(uint16_t globalCounterId,
                                 uint16_t backendCounterId,
                                 const armnn::BackendId& backendId) = 0;
    virtual void Reset() = 0;
    virtual ~IRegisterCounterMapping() {}
};

class CounterIdMap : public ICounterMappings, public IRegisterCounterMapping
{

public:
    CounterIdMap() = default;
    virtual ~CounterIdMap() {}
    void RegisterMapping(uint16_t globalCounterId,
                         uint16_t backendCounterId,
                         const armnn::BackendId& backendId) override;
    void Reset() override;
    uint16_t GetGlobalId(uint16_t backendCounterId, const armnn::BackendId& backendId) const override;
    const std::pair<uint16_t, armnn::BackendId>& GetBackendId(uint16_t globalCounterId) const override;
private:
    std::map<uint16_t, std::pair<uint16_t, armnn::BackendId>> m_GlobalCounterIdMap;
    std::map<std::pair<uint16_t, armnn::BackendId>, uint16_t> m_BackendCounterIdMap;
};

}    // namespace pipe
}    // namespace arm
