You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.1 KiB
128 lines
3.1 KiB
//===- StringEntry.h ------------------------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef MCLD_ADT_STRINGENTRY_H_
|
|
#define MCLD_ADT_STRINGENTRY_H_
|
|
|
|
#include <llvm/ADT/StringRef.h>
|
|
#include <llvm/Support/DataTypes.h>
|
|
|
|
#include <cassert>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
|
|
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 key().equals(pX); }
|
|
|
|
bool compare(const llvm::StringRef& pX) const { return key().equals(pX); }
|
|
|
|
private:
|
|
StringEntry();
|
|
explicit 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 key().equals(pX); }
|
|
|
|
bool compare(const llvm::StringRef pX) const { return key().equals(pX); }
|
|
|
|
private:
|
|
StringEntry();
|
|
explicit 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 mcld
|
|
|
|
#endif // MCLD_ADT_STRINGENTRY_H_
|