Allow modifying an ImmutableMap without canonicalizing it immediately.
authorJordan Rose <jordan_rose@apple.com>
Thu, 6 Dec 2012 19:01:24 +0000 (19:01 +0000)
committerJordan Rose <jordan_rose@apple.com>
Thu, 6 Dec 2012 19:01:24 +0000 (19:01 +0000)
This is an alternative to the ImmutableMapRef interface where a factory
should still be canonicalizing by default, but in certain cases an
improvement can be made by delaying the canonicalization.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169532 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/ImmutableMap.h

index 4883c5b..0043dc6 100644 (file)
@@ -96,27 +96,40 @@ public:
 
   class Factory {
     typename TreeTy::Factory F;
 
   class Factory {
     typename TreeTy::Factory F;
-    const bool Canonicalize;
+    const bool Canonicalizing;
 
   public:
     Factory(bool canonicalize = true)
 
   public:
     Factory(bool canonicalize = true)
-      : Canonicalize(canonicalize) {}
+      : Canonicalizing(canonicalize) {}
     
     Factory(BumpPtrAllocator& Alloc, bool canonicalize = true)
     
     Factory(BumpPtrAllocator& Alloc, bool canonicalize = true)
-      : F(Alloc), Canonicalize(canonicalize) {}
+      : F(Alloc), Canonicalizing(canonicalize) {}
 
     ImmutableMap getEmptyMap() { return ImmutableMap(F.getEmptyTree()); }
 
 
     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);
     }
 
       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);
     }
 
       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);
     }
     typename TreeTy::Factory *getTreeFactory() const {
       return const_cast<typename TreeTy::Factory *>(&F);
     }