| //===- 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 |
| |