StringEntry.h revision 37b74a387bb3993387029859c2d9d051c41c724e
137b74a387bb3993387029859c2d9d051c41c724eStephen Hines//===- StringEntry.h ------------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_ADT_STRINGENTRY_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_ADT_STRINGENTRY_H_
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/StringRef.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/DataTypes.h>
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <cassert>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <cstdlib>
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <cstring>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <typename DataType>
21affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringEntryFactory;
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class StringEntry
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief StringEntry is a pair of strings which is designed for high locality.
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <typename DataType>
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass StringEntry {
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  typedef llvm::StringRef key_type;
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef DataType value_type;
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  key_type key() { return key_type(m_Key, m_KeyLen); }
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const key_type key() const { return key_type(m_Key, m_KeyLen); }
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  value_type& value() { return m_Value; }
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const value_type& value() const { return m_Value; }
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  size_t getKeyLength() const { return m_KeyLen; }
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  size_t getValueLength() const { return m_Value.size(); }
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void setValue(const DataType& pVal) { m_Value = pVal; }
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  bool compare(const llvm::StringRef& pX) { return key().equals(pX); }
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  bool compare(const llvm::StringRef& pX) const { return key().equals(pX); }
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry();
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit StringEntry(const key_type& pKey);
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry(const StringEntry& pCopy);
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~StringEntry();
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DataType m_Value;
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint16_t m_KeyLen;
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  char m_Key[];
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  friend class StringEntryFactory<DataType>;
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass StringEntry<llvm::StringRef> {
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef llvm::StringRef key_type;
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef llvm::StringRef value_type;
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  key_type key() { return key_type(m_Key, m_KeyLen); }
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const key_type key() const { return key_type(m_Key, m_KeyLen); }
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  value_type& value() { return m_Value; }
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const value_type& value() const { return m_Value; }
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  size_t getKeyLength() const { return m_KeyLen; }
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  size_t getValueLength() const { return m_Value.size(); }
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void setValue(const std::string& pVal) { setValue(pVal.c_str()); }
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setValue(const char* pVal);
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void setValue(llvm::StringRef pVal);
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  bool compare(const llvm::StringRef pX) { return key().equals(pX); }
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  bool compare(const llvm::StringRef pX) const { return key().equals(pX); }
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry();
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit StringEntry(const key_type& pKey);
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry(const StringEntry& pCopy);
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~StringEntry();
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::StringRef m_Value;
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint16_t m_KeyLen;
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  char m_Key[];
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  friend class StringEntryFactory<llvm::StringRef>;
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <typename DataType>
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass StringEntryFactory {
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  typedef StringEntry<DataType> entry_type;
11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  typedef typename StringEntry<DataType>::key_type key_type;
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef typename StringEntry<DataType>::value_type value_type;
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntryFactory();
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~StringEntryFactory();
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry<DataType>* produce(const key_type& pKey);
120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void destroy(StringEntry<DataType>* pEntry);
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "StringEntry.tcc"
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_ADT_STRINGENTRY_H_
128