DenseSet.h revision ccb4f2d813380d8cf139062b8c829e4b8b322c0d
1//===- llvm/ADT/DenseSet.h - Dense probed hash table ------------*- 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 defines the DenseSet class. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_ADT_DENSESET_H 15#define LLVM_ADT_DENSESET_H 16 17#include "llvm/ADT/DenseMap.h" 18 19namespace llvm { 20 21/// DenseSet - This implements a dense probed hash-table based set. 22/// 23/// FIXME: This is currently implemented directly in terms of DenseMap, this 24/// should be optimized later if there is a need. 25template<typename ValueT, typename ValueInfoT = DenseMapInfo<ValueT> > 26class DenseSet { 27 typedef DenseMap<ValueT, char, ValueInfoT> MapTy; 28 MapTy TheMap; 29public: 30 DenseSet(const DenseSet &Other) : TheMap(Other.TheMap) {} 31 explicit DenseSet(unsigned NumInitBuckets = 64) : TheMap(NumInitBuckets) {} 32 33 bool empty() const { return TheMap.empty(); } 34 unsigned size() const { return TheMap.size(); } 35 36 void clear() { 37 TheMap.clear(); 38 } 39 40 bool count(const ValueT &V) const { 41 return TheMap.count(V); 42 } 43 44 bool erase(const ValueT &V) { 45 return TheMap.erase(V); 46 } 47 48 void swap(DenseSet& RHS) { 49 TheMap.swap(RHS.TheMap); 50 } 51 52 DenseSet &operator=(const DenseSet &RHS) { 53 TheMap = RHS.TheMap; 54 return *this; 55 } 56 57 // Iterators. 58 59 class Iterator { 60 typename MapTy::iterator I; 61 public: 62 typedef typename MapTy::iterator::difference_type difference_type; 63 typedef ValueT value_type; 64 typedef value_type *pointer; 65 typedef value_type &reference; 66 typedef std::forward_iterator_tag iterator_category; 67 68 Iterator(const typename MapTy::iterator &i) : I(i) {} 69 70 ValueT& operator*() { return I->first; } 71 ValueT* operator->() { return &I->first; } 72 73 Iterator& operator++() { ++I; return *this; } 74 bool operator==(const Iterator& X) const { return I == X.I; } 75 bool operator!=(const Iterator& X) const { return I != X.I; } 76 }; 77 78 class ConstIterator { 79 typename MapTy::const_iterator I; 80 public: 81 typedef typename MapTy::const_iterator::difference_type difference_type; 82 typedef ValueT value_type; 83 typedef value_type *pointer; 84 typedef value_type &reference; 85 typedef std::forward_iterator_tag iterator_category; 86 87 ConstIterator(const typename MapTy::const_iterator &i) : I(i) {} 88 89 const ValueT& operator*() { return I->first; } 90 const ValueT* operator->() { return &I->first; } 91 92 ConstIterator& operator++() { ++I; return *this; } 93 bool operator==(const ConstIterator& X) const { return I == X.I; } 94 bool operator!=(const ConstIterator& X) const { return I != X.I; } 95 }; 96 97 typedef Iterator iterator; 98 typedef ConstIterator const_iterator; 99 100 iterator begin() { return Iterator(TheMap.begin()); } 101 iterator end() { return Iterator(TheMap.end()); } 102 103 const_iterator begin() const { return ConstIterator(TheMap.begin()); } 104 const_iterator end() const { return ConstIterator(TheMap.end()); } 105 106 std::pair<iterator, bool> insert(const ValueT &V) { 107 return TheMap.insert(std::make_pair(V, 0)); 108 } 109 110 // Range insertion of values. 111 template<typename InputIt> 112 void insert(InputIt I, InputIt E) { 113 for (; I != E; ++I) 114 insert(*I); 115 } 116}; 117 118} // end namespace llvm 119 120#endif 121