StringEntry.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
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#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; 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao char m_Key[]; 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; 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao char m_Key[]; 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