Allow modifying an ImmutableMap without canonicalizing it immediately.

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.

llvm-svn: 169532
This commit is contained in:
Jordan Rose 2012-12-06 19:01:24 +00:00
parent 1eb71a1ba7
commit 9163978b2c
1 changed files with 18 additions and 5 deletions

View File

@ -96,27 +96,40 @@ 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);
}