| //===- StringEntry.h -------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_STRING_ENTRY_H |
| #define MCLD_STRING_ENTRY_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| #include <llvm/ADT/StringRef.h> |
| #include <llvm/Support/DataTypes.h> |
| #include <cstdlib> |
| #include <cstring> |
| #include <cassert> |
| |
| namespace mcld |
| { |
| template<typename DataType> |
| class StringEntryFactory; |
| |
| /** \class StringEntry |
| * \brief StringEntry is a pair of strings which is designed for high locality. |
| */ |
| template<typename DataType> |
| class StringEntry |
| { |
| public: |
| typedef llvm::StringRef key_type; |
| typedef DataType value_type; |
| |
| public: |
| key_type key() |
| { return key_type(m_Key, m_KeyLen); } |
| |
| const key_type key() const |
| { return key_type(m_Key, m_KeyLen); } |
| |
| value_type& value() |
| { return m_Value; } |
| |
| const value_type& value() const |
| { return m_Value; } |
| |
| size_t getKeyLength() const |
| { return m_KeyLen; } |
| |
| size_t getValueLength() const |
| { return m_Value.size(); } |
| |
| void setValue(const DataType& pVal) |
| { m_Value = pVal; } |
| |
| bool compare(const llvm::StringRef& pX) |
| { return (0 == key().compare(pX)); } |
| |
| bool compare(const llvm::StringRef& pX) const |
| { return (0 == key().compare(pX)); } |
| |
| private: |
| StringEntry(); |
| StringEntry(const key_type& pKey); |
| StringEntry(const StringEntry& pCopy); |
| ~StringEntry(); |
| |
| private: |
| DataType m_Value; |
| uint16_t m_KeyLen; |
| char m_Key[]; |
| |
| friend class StringEntryFactory<DataType>; |
| }; |
| |
| |
| template<> |
| class StringEntry<llvm::StringRef> |
| { |
| public: |
| typedef llvm::StringRef key_type; |
| typedef llvm::StringRef value_type; |
| |
| public: |
| key_type key() |
| { return key_type(m_Key, m_KeyLen); } |
| |
| const key_type key() const |
| { return key_type(m_Key, m_KeyLen); } |
| |
| value_type& value() |
| { return m_Value; } |
| |
| const value_type& value() const |
| { return m_Value; } |
| |
| size_t getKeyLength() const |
| { return m_KeyLen; } |
| |
| size_t getValueLength() const |
| { return m_Value.size(); } |
| |
| void setValue(const std::string& pVal) |
| { setValue(pVal.c_str()); } |
| |
| void setValue(const char* pVal); |
| |
| void setValue(llvm::StringRef& pVal); |
| |
| bool compare(const llvm::StringRef& pX) |
| { return (0 == key().compare(pX)); } |
| |
| bool compare(const llvm::StringRef& pX) const |
| { return (0 == key().compare(pX)); } |
| |
| private: |
| StringEntry(); |
| StringEntry(const key_type& pKey); |
| StringEntry(const StringEntry& pCopy); |
| ~StringEntry(); |
| |
| private: |
| llvm::StringRef m_Value; |
| uint16_t m_KeyLen; |
| char m_Key[]; |
| |
| friend class StringEntryFactory<llvm::StringRef>; |
| }; |
| |
| template<typename DataType> |
| class StringEntryFactory |
| { |
| public: |
| typedef StringEntry<DataType> entry_type; |
| typedef typename StringEntry<DataType>::key_type key_type; |
| typedef typename StringEntry<DataType>::value_type value_type; |
| |
| public: |
| StringEntryFactory(); |
| ~StringEntryFactory(); |
| |
| StringEntry<DataType>* produce(const key_type& pKey); |
| void destroy(StringEntry<DataType>* pEntry); |
| }; |
| |
| #include "StringEntry.tcc" |
| |
| } // namespace of mcld |
| |
| #endif |
| |