//===- SymbolEntryMap.h ---------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_TARGET_SYMBOL_ENTRY_MAP_H
#define MCLD_TARGET_SYMBOL_ENTRY_MAP_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <vector>
namespace mcld {
class ResolveInfo;
/** \class SymbolEntryMap
* \brief SymbolEntryMap is a <const ResolveInfo*, ENTRY*> map.
*/
template<typename ENTRY>
class SymbolEntryMap
{
public:
typedef ENTRY EntryType;
private:
struct Mapping {
const ResolveInfo* symbol;
EntryType* entry;
};
typedef std::vector<Mapping> SymbolEntryPool;
public:
typedef typename SymbolEntryPool::iterator iterator;
typedef typename SymbolEntryPool::const_iterator const_iterator;
public:
const EntryType* lookUp(const ResolveInfo& pSymbol) const;
EntryType* lookUp(const ResolveInfo& pSymbol);
void record(const ResolveInfo& pSymbol, EntryType& pEntry);
bool empty() const { return m_Pool.empty(); }
size_t size () const { return m_Pool.size(); }
const_iterator begin() const { return m_Pool.begin(); }
iterator begin() { return m_Pool.begin(); }
const_iterator end () const { return m_Pool.end(); }
iterator end () { return m_Pool.end(); }
void reserve(size_t pSize) { m_Pool.reserve(pSize); }
private:
SymbolEntryPool m_Pool;
};
template<typename EntryType>
const EntryType*
SymbolEntryMap<EntryType>::lookUp(const ResolveInfo& pSymbol) const
{
const_iterator mapping, mEnd = m_Pool.end();
for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) {
if (mapping->symbol == &pSymbol) {
return mapping->entry;
}
}
return NULL;
}
template<typename EntryType>
EntryType*
SymbolEntryMap<EntryType>::lookUp(const ResolveInfo& pSymbol)
{
iterator mapping, mEnd = m_Pool.end();
for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) {
if (mapping->symbol == &pSymbol) {
return mapping->entry;
}
}
return NULL;
}
template<typename EntryType>
void
SymbolEntryMap<EntryType>::record(const ResolveInfo& pSymbol, EntryType& pEntry)
{
Mapping mapping;
mapping.symbol = &pSymbol;
mapping.entry = &pEntry;
m_Pool.push_back(mapping);
}
} // namespace of mcld
#endif