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

using namespace mcld;

//==========================
// ResolveInfoFactory
ResolveInfoFactory::entry_type*
ResolveInfoFactory::produce(const ResolveInfoFactory::key_type& pKey)
{
  entry_type* result = static_cast<entry_type*>(
                                    malloc(sizeof(entry_type)+pKey.size()+1));
  if (NULL == result)
    return NULL;

  new (result) entry_type();
  std::memcpy(result->m_Name, pKey.data(), pKey.size());
  result->m_Name[pKey.size()] = '\0';
  result->m_BitField &= ~ResolveInfo::RESOLVE_MASK;
  result->m_BitField |= (pKey.size() << ResolveInfo::NAME_LENGTH_OFFSET);
  return result;
}

void ResolveInfoFactory::destroy(ResolveInfoFactory::entry_type* pEntry)
{
  if (NULL != pEntry) {
    pEntry->~entry_type();
    free(pEntry);
  }
}