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

#ifndef MCLD_HASH_ENTRY_H
#define MCLD_HASH_ENTRY_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif

namespace mcld {

/** forward declaration **/
template<typename HashEntryTy>
class EntryFactory;

/** \class HashEntry
 *  \brief HashEntry is the item in the bucket of hash table.
 *
 *  mcld::HashEntry illustrates the demand from mcld::HashTable.
 *  Since HashTable can change the definition of the HashEntry by changing
 *  the template argument. class mcld::HashEntry here is used to show the
 *  basic interfaces that HashTable requests. You can define your own entry
 *  of the hash table which has no relation to mcld::HashEntry
 *
 *  Since mcld::HashEntry here is a special class whose size is changing,
 *  derive a new class from it is risky. Make sure you understand what you
 *  are doing when you let a new class inherit from mcld::HashEntry.
 */
template <typename KeyType, typename ValueType, typename KeyCompare>
class HashEntry
{
public:
  typedef KeyType key_type;
  typedef ValueType value_type;
  typedef KeyCompare key_compare;

private:
  typedef HashEntry<KeyType, ValueType, KeyCompare> Self;
  friend class EntryFactory<Self>;

private:
  HashEntry(const KeyType& pKey);
  ~HashEntry();

public:
  KeyType& key()
  { return m_Key; }

  const KeyType& key() const
  { return m_Key; }

  ValueType& value()
  { return m_Value; }

  const ValueType& value() const
  { return m_Value; }

  void setValue(const ValueType& pValue)
  { m_Value = pValue; }

  bool compare(const key_type& pKey);

public:
  KeyType m_Key;
  ValueType m_Value;
};

template <typename HashEntryTy>
class EntryFactory
{
public:
  typedef HashEntryTy                      entry_type;
  typedef typename HashEntryTy::key_type   key_type;
  typedef typename HashEntryTy::value_type value_type;

public:
  EntryFactory();
  ~EntryFactory();

  HashEntryTy* produce(const key_type& pKey);
  void destroy(HashEntryTy* pEntry);
};

#include "HashEntry.tcc"

} // namespace of mcld

#endif

