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