[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