Skip to content

Commit

Permalink
Allow modifying an ImmutableMap without canonicalizing it immediately.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jrose-apple committed Dec 6, 2012
1 parent b2af3a0 commit 972f087
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions include/llvm/ADT/ImmutableMap.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,27 +96,40 @@ class ImmutableMap {

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);
}
Expand Down

0 comments on commit 972f087

Please sign in to comment.