blob: 99610cc67d21a0e1bc694b6ee2e754d4ceaf584c [file] [log] [blame]
//===- 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_