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