Allow modifying an ImmutableMap without canonicalizing it immediately.
[oota-llvm.git] / include / llvm / ADT / ImmutableMap.h
index 7386a3b9a1e3759e14c887a518c700c61facf3fe..0043dc6f000017affb18b698a6651a7f61c99d56 100644 (file)
@@ -96,30 +96,47 @@ public:
 
   class Factory {
     typename TreeTy::Factory F;
-    const bool Canonicalize;
+    const bool Canonicalizing;
 
   public:
     Factory(bool canonicalize = true)
-      : Canonicalize(canonicalize) {}
+      : Canonicalizing(canonicalize) {}
     
     Factory(BumpPtrAllocator& Alloc, bool canonicalize = true)
-      : F(Alloc), Canonicalize(canonicalize) {}
+      : F(Alloc), Canonicalizing(canonicalize) {}
 
     ImmutableMap getEmptyMap() { return ImmutableMap(F.getEmptyTree()); }
 
-    ImmutableMap add(ImmutableMap Old, key_type_ref K, data_type_ref D) {
+    ImmutableMap add(ImmutableMap Old, key_type_ref K, data_type_ref D,
+                     bool Canonicalize) {
       TreeTy *T = F.add(Old.Root, std::pair<key_type,data_type>(K,D));
       return ImmutableMap(Canonicalize ? F.getCanonicalTree(T): T);
     }
 
-    ImmutableMap remove(ImmutableMap Old, key_type_ref K) {
+    ImmutableMap add(ImmutableMap Old, key_type_ref K, data_type_ref D) {
+      return add(Old, K, D, Canonicalizing);
+    }
+
+    ImmutableMap remove(ImmutableMap Old, key_type_ref K, bool Canonicalize) {
       TreeTy *T = F.remove(Old.Root,K);
       return ImmutableMap(Canonicalize ? F.getCanonicalTree(T): T);
     }
 
+    ImmutableMap remove(ImmutableMap Old, key_type_ref K) {
+      return remove(Old, K, Canonicalizing);
+    }
+
+    ImmutableMap getCanonicalMap(ImmutableMap Map) {
+      return ImmutableMap(F.getCanonicalTree(Map.Root));
+    }
+
+    typename TreeTy::Factory *getTreeFactory() const {
+      return const_cast<typename TreeTy::Factory *>(&F);
+    }
+
   private:
-    Factory(const Factory& RHS); // DO NOT IMPLEMENT
-    void operator=(const Factory& RHS); // DO NOT IMPLEMENT
+    Factory(const Factory& RHS) LLVM_DELETED_FUNCTION;
+    void operator=(const Factory& RHS) LLVM_DELETED_FUNCTION;
   };
 
   bool contains(key_type_ref K) const {