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