| //===- llvm/ADT/DenseSet.h - Dense probed hash table ------------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file defines the DenseSet class. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_ADT_DENSESET_H | |
| #define LLVM_ADT_DENSESET_H | |
| #include "llvm/ADT/DenseMap.h" | |
| namespace llvm { | |
| /// DenseSet - This implements a dense probed hash-table based set. | |
| /// | |
| /// FIXME: This is currently implemented directly in terms of DenseMap, this | |
| /// should be optimized later if there is a need. | |
| template<typename ValueT, typename ValueInfoT = DenseMapInfo<ValueT> > | |
| class DenseSet { | |
| typedef DenseMap<ValueT, char, ValueInfoT> MapTy; | |
| MapTy TheMap; | |
| public: | |
| DenseSet(const DenseSet &Other) : TheMap(Other.TheMap) {} | |
| explicit DenseSet(unsigned NumInitBuckets = 0) : TheMap(NumInitBuckets) {} | |
| bool empty() const { return TheMap.empty(); } | |
| unsigned size() const { return TheMap.size(); } | |
| /// Grow the denseset so that it has at least Size buckets. Does not shrink | |
| void resize(size_t Size) { TheMap.resize(Size); } | |
| void clear() { | |
| TheMap.clear(); | |
| } | |
| bool count(const ValueT &V) const { | |
| return TheMap.count(V); | |
| } | |
| bool erase(const ValueT &V) { | |
| return TheMap.erase(V); | |
| } | |
| void swap(DenseSet& RHS) { | |
| TheMap.swap(RHS.TheMap); | |
| } | |
| DenseSet &operator=(const DenseSet &RHS) { | |
| TheMap = RHS.TheMap; | |
| return *this; | |
| } | |
| // Iterators. | |
| class Iterator { | |
| typename MapTy::iterator I; | |
| friend class DenseSet; | |
| public: | |
| typedef typename MapTy::iterator::difference_type difference_type; | |
| typedef ValueT value_type; | |
| typedef value_type *pointer; | |
| typedef value_type &reference; | |
| typedef std::forward_iterator_tag iterator_category; | |
| Iterator(const typename MapTy::iterator &i) : I(i) {} | |
| ValueT& operator*() { return I->first; } | |
| ValueT* operator->() { return &I->first; } | |
| Iterator& operator++() { ++I; return *this; } | |
| bool operator==(const Iterator& X) const { return I == X.I; } | |
| bool operator!=(const Iterator& X) const { return I != X.I; } | |
| }; | |
| class ConstIterator { | |
| typename MapTy::const_iterator I; | |
| friend class DenseSet; | |
| public: | |
| typedef typename MapTy::const_iterator::difference_type difference_type; | |
| typedef ValueT value_type; | |
| typedef value_type *pointer; | |
| typedef value_type &reference; | |
| typedef std::forward_iterator_tag iterator_category; | |
| ConstIterator(const typename MapTy::const_iterator &i) : I(i) {} | |
| const ValueT& operator*() { return I->first; } | |
| const ValueT* operator->() { return &I->first; } | |
| ConstIterator& operator++() { ++I; return *this; } | |
| bool operator==(const ConstIterator& X) const { return I == X.I; } | |
| bool operator!=(const ConstIterator& X) const { return I != X.I; } | |
| }; | |
| typedef Iterator iterator; | |
| typedef ConstIterator const_iterator; | |
| iterator begin() { return Iterator(TheMap.begin()); } | |
| iterator end() { return Iterator(TheMap.end()); } | |
| const_iterator begin() const { return ConstIterator(TheMap.begin()); } | |
| const_iterator end() const { return ConstIterator(TheMap.end()); } | |
| iterator find(const ValueT &V) { return Iterator(TheMap.find(V)); } | |
| void erase(Iterator I) { return TheMap.erase(I.I); } | |
| void erase(ConstIterator CI) { return TheMap.erase(CI.I); } | |
| std::pair<iterator, bool> insert(const ValueT &V) { | |
| return TheMap.insert(std::make_pair(V, 0)); | |
| } | |
| // Range insertion of values. | |
| template<typename InputIt> | |
| void insert(InputIt I, InputIt E) { | |
| for (; I != E; ++I) | |
| insert(*I); | |
| } | |
| }; | |
| } // end namespace llvm | |
| #endif |