/*
 Copyright 2019 Alain Dargelas

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

/*
 * File:   SymbolTable.cpp
 * Author: alain
 *
 * Created on March 6, 2017, 11:10 PM
 */
#include <iostream>
#include "SymbolTable.h"
#include <mutex>
#include <vector>

using namespace SURELOG;

std::string SymbolTable::m_badSymbol("@@BAD_SYMBOL@@");
std::string SymbolTable::m_emptyMacroMarker("@@EMPTY_MACRO@@");
SymbolId SymbolTable::m_badId = 0;

SymbolTable::SymbolTable() : m_idCounter(1) {
  m_id2SymbolMap.push_back(m_badSymbol);
  m_symbol2IdMap.insert(std::make_pair(m_badSymbol, 0));
}

SymbolTable::~SymbolTable() {}

SymbolId SymbolTable::registerSymbol(const std::string symbol) {
  std::unordered_map<std::string, SymbolId>::iterator itr =
      m_symbol2IdMap.find(symbol);
  if (itr == m_symbol2IdMap.end()) {
    m_symbol2IdMap.insert(std::make_pair(symbol, m_idCounter));
    m_id2SymbolMap.push_back(symbol);
    m_idCounter++;
    SymbolId tmp = m_idCounter - 1;
    return (tmp);
  } else {
    SymbolId tmp = (*itr).second;
    return tmp;
  }
}

SymbolId SymbolTable::getId(const std::string symbol) {
  std::unordered_map<std::string, SymbolId>::iterator itr =
      m_symbol2IdMap.find(symbol);
  if (itr == m_symbol2IdMap.end()) {
    return 0;
  } else {
    SymbolId tmp = (*itr).second;
    return tmp;
  }
}

const std::string SymbolTable::getSymbol(SymbolId id) {
  return m_id2SymbolMap[id];
}
