1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- 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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_ADT_STRINGENTRY_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_ADT_STRINGENTRY_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/StringRef.h>
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/DataTypes.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <cstdlib>
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <cstring>
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <cassert>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
17affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
19affc150dc44fab1911775a49636d0ce85333b634Zonr Changtemplate<typename DataType>
20affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringEntryFactory;
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class StringEntry
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief StringEntry is a pair of strings which is designed for high locality.
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
25affc150dc44fab1911775a49636d0ce85333b634Zonr Changtemplate<typename DataType>
26affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringEntry
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
28affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef llvm::StringRef   key_type;
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef DataType value_type;
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
32affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  key_type key()
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return key_type(m_Key, m_KeyLen); }
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const key_type key() const
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return key_type(m_Key, m_KeyLen); }
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  value_type& value()
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_Value; }
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const value_type& value() const
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_Value; }
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  size_t getKeyLength() const
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_KeyLen; }
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  size_t getValueLength() const
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_Value.size(); }
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setValue(const DataType& pVal)
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { m_Value = pVal; }
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool compare(const llvm::StringRef& pX)
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return (0 == key().compare(pX)); }
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool compare(const llvm::StringRef& pX) const
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return (0 == key().compare(pX)); }
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
60affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry();
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry(const key_type& pKey);
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry(const StringEntry& pCopy);
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~StringEntry();
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
66affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  DataType m_Value;
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint16_t m_KeyLen;
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  char m_Key[];
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  friend class StringEntryFactory<DataType>;
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
75affc150dc44fab1911775a49636d0ce85333b634Zonr Changtemplate<>
76affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringEntry<llvm::StringRef>
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
78affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef llvm::StringRef key_type;
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef llvm::StringRef value_type;
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
82affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  key_type key()
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return key_type(m_Key, m_KeyLen); }
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const key_type key() const
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return key_type(m_Key, m_KeyLen); }
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  value_type& value()
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_Value; }
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const value_type& value() const
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_Value; }
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  size_t getKeyLength() const
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_KeyLen; }
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  size_t getValueLength() const
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_Value.size(); }
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setValue(const std::string& pVal)
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { setValue(pVal.c_str()); }
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setValue(const char* pVal);
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void setValue(llvm::StringRef& pVal);
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool compare(const llvm::StringRef& pX)
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return (0 == key().compare(pX)); }
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool compare(const llvm::StringRef& pX) const
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return (0 == key().compare(pX)); }
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
114affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry();
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry(const key_type& pKey);
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry(const StringEntry& pCopy);
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~StringEntry();
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
120affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  llvm::StringRef m_Value;
122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  uint16_t m_KeyLen;
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  char m_Key[];
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  friend class StringEntryFactory<llvm::StringRef>;
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
128affc150dc44fab1911775a49636d0ce85333b634Zonr Changtemplate<typename DataType>
129affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass StringEntryFactory
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
131affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef StringEntry<DataType>             entry_type;
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef typename StringEntry<DataType>::key_type   key_type;
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef typename StringEntry<DataType>::value_type value_type;
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
136affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntryFactory();
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~StringEntryFactory();
139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  StringEntry<DataType>* produce(const key_type& pKey);
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void destroy(StringEntry<DataType>* pEntry);
142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "StringEntry.tcc"
145affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
148affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
150