//===- MergedStringTable.cpp ----------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mcld/LD/MergedStringTable.h"

namespace mcld {

bool MergedStringTable::insertString(llvm::StringRef pString) {
  return m_StringMap.insert(std::make_pair(pString, 0)).second;
}

uint64_t MergedStringTable::finalizeOffset() {
  // trverse the string table and set the offset
  string_map_iterator it, end = m_StringMap.end();
  size_t offset = 0;
  for (it = m_StringMap.begin(); it != end; ++it) {
    it->setValue(offset);
    offset += it->getKey().size() + 1;
  }
  return offset;
}

void MergedStringTable::emit(MemoryRegion& pRegion) {
  char* ptr = reinterpret_cast<char*>(pRegion.begin());
  string_map_iterator it, end = m_StringMap.end();
  for (it = m_StringMap.begin(); it != end; ++it) {
    ::memcpy(ptr, it->getKey().data(), it->getKey().size());
    ptr += it->getKey().size() + 1;
  }
}

size_t MergedStringTable::getOutputOffset(llvm::StringRef pStr) {
  assert(m_StringMap.find(pStr) != m_StringMap.end());
  return m_StringMap[pStr];
}

}  // namespace mcld