187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- KeyEntryMap.h ---------------------------------------------------===// 287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// The MCLinker Project 487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source 687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details. 787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_TARGET_KEYENTRYMAP_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_TARGET_KEYENTRYMAP_H 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <vector> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <list> 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld { 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class KeyEntryMap 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief KeyEntryMap is a <const KeyType*, ENTRY*> map. 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KEY, typename ENTRY> 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass KeyEntryMap 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KEY KeyType; 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef ENTRY EntryType; 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines struct EntryPair { 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryPair(EntryType* pEntry1, EntryType* pEntry2) 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines : entry1(pEntry1), entry2(pEntry2) 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines {} 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType* entry1; 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType* entry2; 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// EntryOrPair - A key may mapping to a signal entry or a pair of entries, 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// user is responsible for the type of Mapping.entry 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines union EntryOrPair { 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType* entry_ptr; 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryPair* pair_ptr; 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines struct Mapping { 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const KeyType* key; 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryOrPair entry; 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<Mapping> KeyEntryPool; 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::list<EntryPair> PairListType; 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef typename KeyEntryPool::iterator iterator; 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef typename KeyEntryPool::const_iterator const_iterator; 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// lookUp - look up the entry mapping to pKey 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const EntryType* lookUp(const KeyType& pKey) const; 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType* lookUp(const KeyType& pKey); 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// lookUpFirstEntry - look up the first entry mapping to pKey 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const EntryType* lookUpFirstEntry(const KeyType& pKey) const; 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType* lookUpFirstEntry(const KeyType& pKey); 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// lookUpSecondEntry - look up the second entry mapping to pKey 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const EntryType* lookUpSecondEntry(const KeyType& pKey) const; 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType* lookUpSecondEntry(const KeyType& pKey); 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void record(const KeyType& pKey, EntryType& pEntry); 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void record(const KeyType& pKey, 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType& pEntry1, 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType& pEntry2); 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool empty() const { return m_Pool.empty(); } 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size () const { return m_Pool.size(); } 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator begin() const { return m_Pool.begin(); } 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator begin() { return m_Pool.begin(); } 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator end () const { return m_Pool.end(); } 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator end () { return m_Pool.end(); } 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void reserve(size_t pSize) { m_Pool.reserve(pSize); } 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines KeyEntryPool m_Pool; 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// m_Pairs - the EntryPairs 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines PairListType m_Pairs; 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesconst EntryType* 9387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::lookUp(const KeyType& pKey) const 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator mapping, mEnd = m_Pool.end(); 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) { 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mapping->key == &pKey) { 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return mapping->entry.entry_ptr; 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return NULL; 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 10687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesEntryType* 10787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::lookUp(const KeyType& pKey) 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator mapping, mEnd = m_Pool.end(); 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) { 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mapping->key == &pKey) { 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return mapping->entry.entry_ptr; 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return NULL; 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesconst EntryType* 12187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::lookUpFirstEntry(const KeyType& pKey) const 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator mapping, mEnd = m_Pool.end(); 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) { 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mapping->key == &pKey) { 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return mapping->entry.pair_ptr->entry1; 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return NULL; 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 13487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesEntryType* 13587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::lookUpFirstEntry(const KeyType& pKey) 13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator mapping, mEnd = m_Pool.end(); 13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) { 13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mapping->key == &pKey) { 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return mapping->entry.pair_ptr->entry1; 14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return NULL; 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesconst EntryType* 14987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::lookUpSecondEntry(const KeyType& pKey) const 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator mapping, mEnd = m_Pool.end(); 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) { 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mapping->key == &pKey) { 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return mapping->entry.pair_ptr->entry2; 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return NULL; 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 16287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesEntryType* 16387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::lookUpSecondEntry(const KeyType& pKey) 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator mapping, mEnd = m_Pool.end(); 16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) { 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mapping->key == &pKey) { 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return mapping->entry.pair_ptr->entry2; 16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return NULL; 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvoid 17787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::record(const KeyType& pKey, EntryType& pEntry) 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Mapping mapping; 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mapping.key = &pKey; 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mapping.entry.entry_ptr = &pEntry; 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_Pool.push_back(mapping); 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<typename KeyType, typename EntryType> 18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvoid 18787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesKeyEntryMap<KeyType, EntryType>::record(const KeyType& pKey, 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType& pEntry1, 18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EntryType& pEntry2) 19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Mapping mapping; 19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mapping.key = &pKey; 19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_Pairs.push_back(EntryPair(&pEntry1, &pEntry2)); 19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mapping.entry.pair_ptr = &m_Pairs.back(); 19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_Pool.push_back(mapping); 19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} 19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld 19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif 20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 202