| //===-- llvm/ADT/IntEqClasses.h - Equiv. Classes of Integers ----*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Equivalence classes for small integers. This is a mapping of the integers | |
| // 0 .. N-1 into M equivalence classes numbered 0 .. M-1. | |
| // | |
| // Initially each integer has its own equivalence class. Classes are joined by | |
| // passing a representative member of each class to join(). | |
| // | |
| // Once the classes are built, compress() will number them 0 .. M-1 and prevent | |
| // further changes. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_ADT_INTEQCLASSES_H | |
| #define LLVM_ADT_INTEQCLASSES_H | |
| #include "llvm/ADT/SmallVector.h" | |
| namespace llvm { | |
| class IntEqClasses { | |
| /// EC - When uncompressed, map each integer to a smaller member of its | |
| /// equivalence class. The class leader is the smallest member and maps to | |
| /// itself. | |
| /// | |
| /// When compressed, EC[i] is the equivalence class of i. | |
| SmallVector<unsigned, 8> EC; | |
| /// NumClasses - The number of equivalence classes when compressed, or 0 when | |
| /// uncompressed. | |
| unsigned NumClasses; | |
| public: | |
| /// IntEqClasses - Create an equivalence class mapping for 0 .. N-1. | |
| IntEqClasses(unsigned N = 0) : NumClasses(0) { grow(N); } | |
| /// grow - Increase capacity to hold 0 .. N-1, putting new integers in unique | |
| /// equivalence classes. | |
| /// This requires an uncompressed map. | |
| void grow(unsigned N); | |
| /// clear - Clear all classes so that grow() will assign a unique class to | |
| /// every integer. | |
| void clear() { | |
| EC.clear(); | |
| NumClasses = 0; | |
| } | |
| /// join - Join the equivalence classes of a and b. After joining classes, | |
| /// findLeader(a) == findLeader(b). | |
| /// This requires an uncompressed map. | |
| void join(unsigned a, unsigned b); | |
| /// findLeader - Compute the leader of a's equivalence class. This is the | |
| /// smallest member of the class. | |
| /// This requires an uncompressed map. | |
| unsigned findLeader(unsigned a) const; | |
| /// compress - Compress equivalence classes by numbering them 0 .. M. | |
| /// This makes the equivalence class map immutable. | |
| void compress(); | |
| /// getNumClasses - Return the number of equivalence classes after compress() | |
| /// was called. | |
| unsigned getNumClasses() const { return NumClasses; } | |
| /// operator[] - Return a's equivalence class number, 0 .. getNumClasses()-1. | |
| /// This requires a compressed map. | |
| unsigned operator[](unsigned a) const { | |
| assert(NumClasses && "operator[] called before compress()"); | |
| return EC[a]; | |
| } | |
| /// uncompress - Change back to the uncompressed representation that allows | |
| /// editing. | |
| void uncompress(); | |
| }; | |
| } // End llvm namespace | |
| #endif |