aboutsummaryrefslogtreecommitdiff
path: root/bisect.c
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2012-10-26 22:53:50 +0700
committerJeff King <peff@peff.net>2012-10-29 03:08:30 -0400
commitc43cb38612192fa45bf7ed981a98bc4ddb86ce75 (patch)
tree14cbc3466675241765085081a5370b56e8ec9ca0 /bisect.c
parentdb699a8a1f2c8063620efae41e66786c11a31d8f (diff)
downloadgit-c43cb38612192fa45bf7ed981a98bc4ddb86ce75.tar.gz
git-c43cb38612192fa45bf7ed981a98bc4ddb86ce75.tar.xz
Move estimate_bisect_steps to libgit.a
This function is used by bisect.c, part of libgit.a while estimate_bisect_steps stays in builtin/rev-list.c. Move it to bisect.a so we won't have undefine reference if a standalone program that uses libgit.a happens to pull it in. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Jeff King <peff@peff.net>
Diffstat (limited to 'bisect.c')
-rw-r--r--bisect.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/bisect.c b/bisect.c
index 1aad49b1a..bd1b7b5da 100644
--- a/bisect.c
+++ b/bisect.c
@@ -956,3 +956,41 @@ int bisect_next_all(const char *prefix, int no_checkout)
return bisect_checkout(bisect_rev_hex, no_checkout);
}
+static inline int log2i(int n)
+{
+ int log2 = 0;
+
+ for (; n > 1; n >>= 1)
+ log2++;
+
+ return log2;
+}
+
+static inline int exp2i(int n)
+{
+ return 1 << n;
+}
+
+/*
+ * Estimate the number of bisect steps left (after the current step)
+ *
+ * For any x between 0 included and 2^n excluded, the probability for
+ * n - 1 steps left looks like:
+ *
+ * P(2^n + x) == (2^n - x) / (2^n + x)
+ *
+ * and P(2^n + x) < 0.5 means 2^n < 3x
+ */
+int estimate_bisect_steps(int all)
+{
+ int n, x, e;
+
+ if (all < 3)
+ return 0;
+
+ n = log2i(all);
+ e = exp2i(n);
+ x = all - e;
+
+ return (e < 3 * x) ? n : n - 1;
+}