//===- 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);
  }
}

