//===- StringEntry.tcc -----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
// StringEntry
template<typename DataType>
StringEntry<DataType>::StringEntry()
  : m_KeyLen(0) {
}

template<typename DataType>
StringEntry<DataType>::StringEntry(const StringEntry::key_type& pKey)
  : m_KeyLen(pKey.size()) {
}

template<typename DataType>
StringEntry<DataType>::StringEntry(const StringEntry<DataType>& pCopy)
  : m_KeyLen(pCopy.m_KeyLen), m_Value(pCopy.m_Value) {
  assert("Copy constructor of StringEntry should not be called!");
}

template<typename DataType>
StringEntry<DataType>::~StringEntry()
{
}

//===----------------------------------------------------------------------===//
// StringEntryFactory
template<typename DataType>
StringEntryFactory<DataType>::StringEntryFactory()
{
}

template<typename DataType>
StringEntryFactory<DataType>::~StringEntryFactory()
{
}

template<typename DataType>
StringEntry<DataType>*
StringEntryFactory<DataType>::produce(const typename StringEntryFactory<DataType>::key_type& pKey)
{
  StringEntry<DataType>* result = static_cast<StringEntry<DataType>*>(
                           malloc(sizeof(StringEntry<DataType>) + pKey.size() + 1));

  if (NULL == result)
    return NULL;

  size_t len = pKey.size();
  new (result) StringEntry<DataType>();
  std::memcpy(result->m_Key, pKey.data(), len);
  result->m_Key[len] = '\0';
  result->m_KeyLen = len;
  return result;
}

template<typename DataType>
void StringEntryFactory<DataType>::destroy(StringEntry<DataType>* pEntry)
{
  if (NULL != pEntry) {
    pEntry->~StringEntry<DataType>();
    free(pEntry);
  }
}