OSDN Git Service

Add a lookup method to the IntervalMap. The difference from the original
authorZhongxing Xu <xuzhongxing@gmail.com>
Tue, 2 Feb 2010 05:23:23 +0000 (05:23 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Tue, 2 Feb 2010 05:23:23 +0000 (05:23 +0000)
lookup is that if the lookup key is contained in the key, we return the data.

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

include/llvm/ADT/ImmutableIntervalMap.h

index 4754e44..74ae5f3 100644 (file)
@@ -65,6 +65,13 @@ struct ImutIntervalInfo {
     }
   }
 
+  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 @@ class ImutIntervalAVLFactory : public ImutAVLFactory<ImutInfo> {
   typedef typename ImutInfo::data_type_ref  data_type_ref;
 
 public:
-  TreeTy *Add(TreeTyT, 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 @@ public:
       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