MapVector.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. //===- llvm/ADT/MapVector.h - Map w/ deterministic value order --*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements a map that provides insertion order iteration. The
  11. // interface is purposefully minimal. The key is assumed to be cheap to copy
  12. // and 2 copies are kept, one for indexing in a DenseMap, one for iteration in
  13. // a std::vector.
  14. //
  15. //===----------------------------------------------------------------------===//
  16. #ifndef LLVM_ADT_MAPVECTOR_H
  17. #define LLVM_ADT_MAPVECTOR_H
  18. #include "llvm/ADT/DenseMap.h"
  19. #include "llvm/ADT/SmallVector.h"
  20. #include <vector>
  21. namespace llvm {
  22. /// This class implements a map that also provides access to all stored values
  23. /// in a deterministic order. The values are kept in a std::vector and the
  24. /// mapping is done with DenseMap from Keys to indexes in that vector.
  25. template<typename KeyT, typename ValueT,
  26. typename MapType = llvm::DenseMap<KeyT, unsigned>,
  27. typename VectorType = std::vector<std::pair<KeyT, ValueT> > >
  28. class MapVector {
  29. typedef typename VectorType::size_type size_type;
  30. MapType Map;
  31. VectorType Vector;
  32. public:
  33. typedef typename VectorType::iterator iterator;
  34. typedef typename VectorType::const_iterator const_iterator;
  35. typedef typename VectorType::reverse_iterator reverse_iterator;
  36. typedef typename VectorType::const_reverse_iterator const_reverse_iterator;
  37. size_type size() const { return Vector.size(); }
  38. iterator begin() { return Vector.begin(); }
  39. const_iterator begin() const { return Vector.begin(); }
  40. iterator end() { return Vector.end(); }
  41. const_iterator end() const { return Vector.end(); }
  42. reverse_iterator rbegin() { return Vector.rbegin(); }
  43. const_reverse_iterator rbegin() const { return Vector.rbegin(); }
  44. reverse_iterator rend() { return Vector.rend(); }
  45. const_reverse_iterator rend() const { return Vector.rend(); }
  46. bool empty() const {
  47. return Vector.empty();
  48. }
  49. std::pair<KeyT, ValueT> &front() { return Vector.front(); }
  50. const std::pair<KeyT, ValueT> &front() const { return Vector.front(); }
  51. std::pair<KeyT, ValueT> &back() { return Vector.back(); }
  52. const std::pair<KeyT, ValueT> &back() const { return Vector.back(); }
  53. void clear() {
  54. Map.clear();
  55. Vector.clear();
  56. }
  57. void swap(MapVector &RHS) {
  58. std::swap(Map, RHS.Map);
  59. std::swap(Vector, RHS.Vector);
  60. }
  61. ValueT &operator[](const KeyT &Key) {
  62. std::pair<KeyT, unsigned> Pair = std::make_pair(Key, 0);
  63. std::pair<typename MapType::iterator, bool> Result = Map.insert(Pair);
  64. unsigned &I = Result.first->second;
  65. if (Result.second) {
  66. Vector.push_back(std::make_pair(Key, ValueT()));
  67. I = Vector.size() - 1;
  68. }
  69. return Vector[I].second;
  70. }
  71. ValueT lookup(const KeyT &Key) const {
  72. typename MapType::const_iterator Pos = Map.find(Key);
  73. return Pos == Map.end()? ValueT() : Vector[Pos->second].second;
  74. }
  75. std::pair<iterator, bool> insert(const std::pair<KeyT, ValueT> &KV) {
  76. std::pair<KeyT, unsigned> Pair = std::make_pair(KV.first, 0);
  77. std::pair<typename MapType::iterator, bool> Result = Map.insert(Pair);
  78. unsigned &I = Result.first->second;
  79. if (Result.second) {
  80. Vector.push_back(std::make_pair(KV.first, KV.second));
  81. I = Vector.size() - 1;
  82. return std::make_pair(std::prev(end()), true);
  83. }
  84. return std::make_pair(begin() + I, false);
  85. }
  86. size_type count(const KeyT &Key) const {
  87. typename MapType::const_iterator Pos = Map.find(Key);
  88. return Pos == Map.end()? 0 : 1;
  89. }
  90. iterator find(const KeyT &Key) {
  91. typename MapType::const_iterator Pos = Map.find(Key);
  92. return Pos == Map.end()? Vector.end() :
  93. (Vector.begin() + Pos->second);
  94. }
  95. const_iterator find(const KeyT &Key) const {
  96. typename MapType::const_iterator Pos = Map.find(Key);
  97. return Pos == Map.end()? Vector.end() :
  98. (Vector.begin() + Pos->second);
  99. }
  100. /// \brief Remove the last element from the vector.
  101. void pop_back() {
  102. typename MapType::iterator Pos = Map.find(Vector.back().first);
  103. Map.erase(Pos);
  104. Vector.pop_back();
  105. }
  106. /// \brief Remove the element given by Iterator.
  107. ///
  108. /// Returns an iterator to the element following the one which was removed,
  109. /// which may be end().
  110. ///
  111. /// \note This is a deceivingly expensive operation (linear time). It's
  112. /// usually better to use \a remove_if() if possible.
  113. typename VectorType::iterator erase(typename VectorType::iterator Iterator) {
  114. Map.erase(Iterator->first);
  115. auto Next = Vector.erase(Iterator);
  116. if (Next == Vector.end())
  117. return Next;
  118. // Update indices in the map.
  119. size_t Index = Next - Vector.begin();
  120. for (auto &I : Map) {
  121. assert(I.second != Index && "Index was already erased!");
  122. if (I.second > Index)
  123. --I.second;
  124. }
  125. return Next;
  126. }
  127. /// \brief Remove all elements with the key value Key.
  128. ///
  129. /// Returns the number of elements removed.
  130. size_type erase(const KeyT &Key) {
  131. auto Iterator = find(Key);
  132. if (Iterator == end())
  133. return 0;
  134. erase(Iterator);
  135. return 1;
  136. }
  137. /// \brief Remove the elements that match the predicate.
  138. ///
  139. /// Erase all elements that match \c Pred in a single pass. Takes linear
  140. /// time.
  141. template <class Predicate> void remove_if(Predicate Pred);
  142. };
  143. template <typename KeyT, typename ValueT, typename MapType, typename VectorType>
  144. template <class Function>
  145. void MapVector<KeyT, ValueT, MapType, VectorType>::remove_if(Function Pred) {
  146. auto O = Vector.begin();
  147. for (auto I = O, E = Vector.end(); I != E; ++I) {
  148. if (Pred(*I)) {
  149. // Erase from the map.
  150. Map.erase(I->first);
  151. continue;
  152. }
  153. if (I != O) {
  154. // Move the value and update the index in the map.
  155. *O = std::move(*I);
  156. Map[O->first] = O - Vector.begin();
  157. }
  158. ++O;
  159. }
  160. // Erase trailing entries in the vector.
  161. Vector.erase(O, Vector.end());
  162. }
  163. /// \brief A MapVector that performs no allocations if smaller than a certain
  164. /// size.
  165. template <typename KeyT, typename ValueT, unsigned N>
  166. struct SmallMapVector
  167. : MapVector<KeyT, ValueT, SmallDenseMap<KeyT, unsigned, N>,
  168. SmallVector<std::pair<KeyT, ValueT>, N>> {
  169. };
  170. } // end namespace llvm
  171. #endif