[llvm-commits] CVS: llvm/include/llvm/ADT/SmallSet.h

Chris Lattner sabre at nondot.org
Mon Jan 22 16:59:31 PST 2007



Changes in directory llvm/include/llvm/ADT:

SmallSet.h added (r1.1)
---
Log message:

add a trivial SmallSet class, which operates on a similar principle to 
SmallVector.


---
Diffs of the changes:  (+76 -0)

 SmallSet.h |   76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+)


Index: llvm/include/llvm/ADT/SmallSet.h
diff -c /dev/null llvm/include/llvm/ADT/SmallSet.h:1.1
*** /dev/null	Mon Jan 22 18:59:25 2007
--- llvm/include/llvm/ADT/SmallSet.h	Mon Jan 22 18:59:15 2007
***************
*** 0 ****
--- 1,76 ----
+ //===- llvm/ADT/SmallSet.h - 'Normally small' sets --------------*- C++ -*-===//
+ //
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Chris Lattner and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file defines the SmallSet class.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #ifndef LLVM_ADT_SMALLSET_H
+ #define LLVM_ADT_SMALLSET_H
+ 
+ #include "llvm/ADT/SmallVector.h"
+ 
+ namespace llvm {
+ 
+ /// SmallSet - This maintains a set of unique values, optimizing for the case
+ /// when the set is small (less than N).  In this case, the set can be
+ /// maintained with no mallocs.
+ ///
+ /// Note that this set does not guarantee that the elements in the set will be
+ /// ordered.
+ template <typename T, unsigned N>
+ class SmallSet {
+   SmallVector<T, N> Vector;
+   typedef typename SmallVector<T, N>::iterator mutable_iterator;
+ public:
+   SmallSet() {}
+ 
+   // Support iteration.
+   typedef typename SmallVector<T, N>::const_iterator iterator;
+   typedef typename SmallVector<T, N>::const_iterator const_iterator;
+   
+   iterator begin() const { return Vector.begin(); }
+   iterator end() const { return Vector.end(); }
+   
+   bool empty() const { return Vector.empty(); }
+   unsigned size() const { return Vector.size(); }
+   
+   /// count - Return true if the element is in the set.
+   unsigned count(const T &V) const {
+     // Since the collection is small, just do a linear search.
+     for (iterator I = begin(), E = end(); I != E; ++I)
+       if (*I == V)
+         return 1;
+     return 0;
+   }
+   
+   /// insert - Insert an element into the set if it isn't already there.
+   void insert(const T &V) {
+     if (count(V)) return;   // Don't reinsert if it already exists.
+     Vector.push_back(V);
+   }
+   
+   void erase(const T &V) {
+     for (mutable_iterator I = Vector.begin(), E = Vector.end(); I != E; ++I)
+       if (*I == V) {
+         Vector.erase(I);
+         return;
+       }
+   }
+   
+   void clear() {
+     Vector.clear();
+   }
+   
+ };
+ 
+ 
+ } // end namespace llvm
+ 
+ #endif






More information about the llvm-commits mailing list