//===- 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