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
13namespace mcld {
14
15/** forward declaration **/
16template <typename HashEntryTy>
17class 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 */
32template <typename KeyType, typename ValueType, typename KeyCompare>
33class 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
65template <typename HashEntryTy>
66class 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