[llvm-commits] [llvm] r95070 - /llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h
Zhongxing Xu
xuzhongxing at gmail.com
Mon Feb 1 21:23:25 PST 2010
Author: zhongxingxu
Date: Mon Feb 1 23:23:23 2010
New Revision: 95070
URL: http://llvm.org/viewvc/llvm-project?rev=95070&view=rev
Log:
Add a lookup method to the IntervalMap. The difference from the original
lookup is that if the lookup key is contained in the key, we return the data.
Modified:
llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h
Modified: llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h?rev=95070&r1=95069&r2=95070&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h (original)
+++ llvm/trunk/include/llvm/ADT/ImmutableIntervalMap.h Mon Feb 1 23:23:23 2010
@@ -65,6 +65,13 @@
}
}
+ static bool isContainedIn(key_type_ref K, key_type_ref L) {
+ if (K.getStart() >= L.getStart() && K.getEnd() <= L.getEnd())
+ return true;
+ else
+ return false;
+ }
+
static void Profile(FoldingSetNodeID &ID, value_type_ref V) {
ID.AddInteger(V.first.getStart());
ID.AddInteger(V.first.getEnd());
@@ -85,12 +92,26 @@
typedef typename ImutInfo::data_type_ref data_type_ref;
public:
- TreeTy *Add(TreeTy* T, value_type_ref V) {
+ TreeTy *Add(TreeTy *T, value_type_ref V) {
T = Add_internal(V,T);
MarkImmutable(T);
return T;
}
+ TreeTy *Find(TreeTy *T, key_type_ref K) {
+ if (!T)
+ return NULL;
+
+ key_type_ref CurrentKey = ImutInfo::KeyOfValue(Value(T));
+
+ if (ImutInfo::isContainedIn(K, CurrentKey))
+ return T;
+ else if (ImutInfo::isLess(K, CurrentKey))
+ return Find(Left(T), K);
+ else
+ return Find(Right(T), K);
+ }
+
private:
TreeTy *Add_internal(value_type_ref V, TreeTy *T) {
key_type_ref K = ImutInfo::KeyOfValue(V);
@@ -198,7 +219,21 @@
TreeTy *T = F.Remove(Old.Root, K);
return ImmutableIntervalMap(F.GetCanonicalTree(T));
}
+
+ data_type *Lookup(ImmutableIntervalMap M, key_type_ref K) {
+ TreeTy *T = F.Find(M.getRoot(), K);
+ if (T)
+ return &T->getValue().second;
+ else
+ return 0;
+ }
+
};
+
+private:
+ // For ImmutableIntervalMap, the lookup operation has to be done by the
+ // factory.
+ data_type* lookup(key_type_ref K) const;
};
} // end namespace llvm
More information about the llvm-commits
mailing list