make traits more flexible by splitting out node-related fragment
[oota-llvm.git] / include / llvm / ADT / EquivalenceClasses.h
index ca9ca63ada9011d66a8e8690fa338656358f3065..6e00a217bebfeecc8d3d0172763bc01a9d40ea1a 100644 (file)
@@ -1,21 +1,22 @@
 //===-- llvm/ADT/EquivalenceClasses.h - Generic Equiv. Classes --*- C++ -*-===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
 //===----------------------------------------------------------------------===//
-// 
+//
 // Generic implementation of equivalence classes through the use Tarjan's
 // efficient union-find algorithm.
-// 
+//
 //===----------------------------------------------------------------------===//
 
 #ifndef LLVM_ADT_EQUIVALENCECLASSES_H
 #define LLVM_ADT_EQUIVALENCECLASSES_H
 
-#include "llvm/ADT/iterator"
+#include "llvm/ADT/iterator.h"
+#include "llvm/Support/DataTypes.h"
 #include <set>
 
 namespace llvm {
@@ -42,8 +43,8 @@ namespace llvm {
 ///    if (!I->isLeader()) continue;   // Ignore non-leader sets.
 ///    for (EquivalenceClasses<int>::member_iterator MI = EC.member_begin(I);
 ///         MI != EC.member_end(); ++MI)   // Loop over members in this set.
-///      std::cerr << *MI << " ";  // Print member.
-///    std::cerr << "\n";   // Finish set.
+///      cerr << *MI << " ";  // Print member.
+///    cerr << "\n";   // Finish set.
 ///  }
 ///
 /// This example prints:
@@ -84,8 +85,7 @@ class EquivalenceClasses {
 
     void setNext(const ECValue *NewNext) const {
       assert(getNext() == 0 && "Already has a next pointer!");
-      bool isL = isLeader();
-      Next = (const ECValue*)((intptr_t)NewNext | isLeader());
+      Next = (const ECValue*)((intptr_t)NewNext | (intptr_t)isLeader());
     }
   public:
     ECValue(const ECValue &RHS) : Leader(this), Next((ECValue*)(intptr_t)1),
@@ -118,14 +118,17 @@ public:
   }
 
   const EquivalenceClasses &operator=(const EquivalenceClasses &RHS) {
+    TheMapping.clear();
     for (iterator I = RHS.begin(), E = RHS.end(); I != E; ++I)
-      if (I->isLeader())
-        insert(I->getData());
-      else
-        unionSets(I->getData(), *RHS.findLeader(I));
+      if (I->isLeader()) {
+        member_iterator MI = RHS.member_begin(I);
+        member_iterator LeaderIt = member_begin(insert(*MI));
+        for (++MI; MI != member_end(); ++MI)
+          unionSets(LeaderIt, member_begin(insert(*MI)));
+      }
     return *this;
   }
-  
+
   //===--------------------------------------------------------------------===//
   // Inspection methods
   //
@@ -135,6 +138,8 @@ public:
   iterator begin() const { return TheMapping.begin(); }
   iterator end() const { return TheMapping.end(); }
 
+  bool empty() const { return TheMapping.empty(); }
+
   /// member_* Iterate over the members of an equivalence class.
   ///
   class member_iterator;
@@ -217,7 +222,7 @@ public:
     // point to the L2 leader node.
     const ECValue &L1LV = *L1.Node, &L2LV = *L2.Node;
     L1LV.getEndOfList()->setNext(&L2LV);
-    
+
     // Update L1LV's end of list pointer.
     L1LV.Leader = L2LV.getEndOfList();