Added support for generic linear/binary search.
authorJim Laskey <jlaskey@mac.com>
Thu, 25 Aug 2005 13:32:25 +0000 (13:32 +0000)
committerJim Laskey <jlaskey@mac.com>
Thu, 25 Aug 2005 13:32:25 +0000 (13:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23044 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Search.h [new file with mode: 0644]

diff --git a/include/llvm/Support/Search.h b/include/llvm/Support/Search.h
new file mode 100644 (file)
index 0000000..3af723e
--- /dev/null
@@ -0,0 +1,78 @@
+//===- llvm/Support/Search.h - Support for searching algorithms -*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// These templates impliment various generic search algorithms.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_SUPPORT_SEARCH_H
+#define LLVM_SUPPORT_SEARCH_H
+
+namespace llvm {
+  // SearchString - generalized string compare method container.  Used for
+  // search templates.
+  struct SearchString {
+    static inline int Compare(const char *A, const char *B) {
+      return strcmp(A, B);
+    }
+  };
+      
+  // LinearSearch - search an array of items for a match using linear search
+  // algorithm.  Return find index or -1 if not found.
+  //   ItemType - type of elements in array.
+  //   CompareClass - container for compare method in form of
+  //                  static int Compare(ItemType A, ItemType B)
+  //                         returns < 0 for A < B
+  //                                 > 0 for A > B
+  //                                 == 0 for A == B
+  //   Match - item to match in array.
+  //   Array - an array of items to be searched.
+  //   Size - size of array in bytes.  
+  //
+  // Eg.  LinearSearch<const char *, SearchString>("key", List, sizeof(List));
+  //
+  template<typename ItemType, class CompareClass>
+  inline int LinearSearch(ItemType Match, ItemType Array[], size_t Size) {
+    unsigned N = Size / sizeof(ItemType);
+    for (unsigned Index = 0; Index < N; Index++) {
+      if (!CompareClass::Compare(Match, Array[Index])) return Index;
+    }
+    return -1;
+  }
+      
+  // BinarySearch - search an array of items for a match using binary search
+  // algorithm.  Return find index or -1 if not found.
+  //   ItemType - type of elements in array.
+  //   CompareClass - container for compare method in form of
+  //                  static int Compare(ItemType A, ItemType B)
+  //                         returns < 0 for A < B
+  //                                 > 0 for A > B
+  //                                 == 0 for A == B
+  //   Match - item to match in array.
+  //   Array - a sorted array of items to be searched.
+  //   Size - size of array in bytes.  
+  //
+  // Eg.  BinarySearch<const char *, SearchString>("key", List, sizeof(List));
+  //
+  template<typename ItemType, class CompareClass>
+  inline int BinarySearch(ItemType Match, ItemType Array[], size_t Size) {
+    int Lo = 0, Hi = Size / sizeof(ItemType);
+    while (Lo <= Hi) {
+      unsigned Mid = (Lo + Hi) >> 1;
+      int Result = CompareClass::Compare(Match, Array[Mid]);
+      if      (Result < 0) Hi = Mid - 1;
+      else if (Result > 0) Lo = Mid + 1;
+      else                 return Mid;
+    }
+    return -1;
+  }
+}
+
+#endif
+