//
// Copyright © 2020 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "CounterIdMap.hpp"

#include <common/include/ProfilingException.hpp>

#include <map>

namespace arm
{
namespace pipe
{

void CounterIdMap::RegisterMapping(uint16_t globalCounterId,
                                   uint16_t backendCounterId,
                                   const std::string& backendId)
{
    std::pair<uint16_t, std::string> backendIdPair(backendCounterId, backendId);
    m_GlobalCounterIdMap[globalCounterId] = backendIdPair;
    m_BackendCounterIdMap[backendIdPair] = globalCounterId;
}

void CounterIdMap::Reset()
{
    m_GlobalCounterIdMap.clear();
    m_BackendCounterIdMap.clear();
}

uint16_t CounterIdMap::GetGlobalId(uint16_t backendCounterId, const std::string& backendId) const
{
    std::pair<uint16_t, std::string> backendIdPair(backendCounterId, backendId);
    auto it = m_BackendCounterIdMap.find(backendIdPair);
    if (it == m_BackendCounterIdMap.end())
    {
        std::stringstream ss;
        ss << "No Backend Counter [" << backendIdPair.second << ":" << backendIdPair.first << "] registered";
        throw arm::pipe::ProfilingException(ss.str());
    }
    return it->second;
}

const std::pair<uint16_t, std::string>& CounterIdMap::GetBackendId(uint16_t globalCounterId) const
{
    auto it = m_GlobalCounterIdMap.find(globalCounterId);
    if (it == m_GlobalCounterIdMap.end())
    {
        std::stringstream ss;
        ss << "No Global Counter ID [" << globalCounterId << "] registered";
        throw arm::pipe::ProfilingException(ss.str());
    }
    return it->second;
}

}    // namespace pipe
}    // namespace arm
