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