Home | History | Annotate | Download | only in ADT
      1 //===- HashEntry.h --------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef MCLD_ADT_HASHENTRY_H_
     11 #define MCLD_ADT_HASHENTRY_H_
     12 
     13 namespace mcld {
     14 
     15 /** forward declaration **/
     16 template <typename HashEntryTy>
     17 class EntryFactory;
     18 
     19 /** \class HashEntry
     20  *  \brief HashEntry is the item in the bucket of hash table.
     21  *
     22  *  mcld::HashEntry illustrates the demand from mcld::HashTable.
     23  *  Since HashTable can change the definition of the HashEntry by changing
     24  *  the template argument. class mcld::HashEntry here is used to show the
     25  *  basic interfaces that HashTable requests. You can define your own entry
     26  *  of the hash table which has no relation to mcld::HashEntry
     27  *
     28  *  Since mcld::HashEntry here is a special class whose size is changing,
     29  *  derive a new class from it is risky. Make sure you understand what you
     30  *  are doing when you let a new class inherit from mcld::HashEntry.
     31  */
     32 template <typename KeyType, typename ValueType, typename KeyCompare>
     33 class HashEntry {
     34  public:
     35   typedef KeyType key_type;
     36   typedef ValueType value_type;
     37   typedef KeyCompare key_compare;
     38 
     39  private:
     40   typedef HashEntry<KeyType, ValueType, KeyCompare> Self;
     41   friend class EntryFactory<Self>;
     42 
     43  private:
     44   explicit HashEntry(const KeyType& pKey);
     45   ~HashEntry();
     46 
     47  public:
     48   KeyType& key() { return m_Key; }
     49 
     50   const KeyType& key() const { return m_Key; }
     51 
     52   ValueType& value() { return m_Value; }
     53 
     54   const ValueType& value() const { return m_Value; }
     55 
     56   void setValue(const ValueType& pValue) { m_Value = pValue; }
     57 
     58   bool compare(const key_type& pKey);
     59 
     60  public:
     61   KeyType m_Key;
     62   ValueType m_Value;
     63 };
     64 
     65 template <typename HashEntryTy>
     66 class EntryFactory {
     67  public:
     68   typedef HashEntryTy entry_type;
     69   typedef typename HashEntryTy::key_type key_type;
     70   typedef typename HashEntryTy::value_type value_type;
     71 
     72  public:
     73   EntryFactory();
     74   ~EntryFactory();
     75 
     76   HashEntryTy* produce(const key_type& pKey);
     77   void destroy(HashEntryTy* pEntry);
     78 };
     79 
     80 #include "HashEntry.tcc"
     81 
     82 }  // namespace mcld
     83 
     84 #endif  // MCLD_ADT_HASHENTRY_H_
     85