From 1f741d63e5c1c4c3eef29b7e681f0fbf8166c439 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 14 Mar 2020 16:20:19 +0800 Subject: [PATCH] support by and idx --- src/util/_impl/_bsearch_impl.scad | 19 ++++++++++++++++--- src/util/bsearch.scad | 5 +++-- src/util/has.scad | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/util/_impl/_bsearch_impl.scad b/src/util/_impl/_bsearch_impl.scad index 7e1e6d79..bb5ffa6c 100644 --- a/src/util/_impl/_bsearch_impl.scad +++ b/src/util/_impl/_bsearch_impl.scad @@ -1,7 +1,20 @@ use ; -function _binary_search(sorted, elem, low, upper) = +function _binary_search_by(sorted, elem, low, upper, i) = low > upper ? -1 : let(mid = floor((low + upper) / 2)) - lessThan(sorted[mid], elem) ? _binary_search(sorted, elem, mid + 1, upper) : - greaterThan(sorted[mid], elem) ? _binary_search(sorted, elem, low, mid - 1) : mid; \ No newline at end of file + sorted[mid][i] < elem[i] ? _binary_search_by(sorted, elem, mid + 1, upper, i) : + sorted[mid][i] > elem[i] ? _binary_search_by(sorted, elem, low, mid - 1, i) : mid; + +function _bsearch_vt(sorted, elem, low, upper) = + low > upper ? -1 : + let(mid = floor((low + upper) / 2)) + lessThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, mid + 1, upper) : + greaterThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, low, mid - 1) : mid; + +function _bsearch_by(sorted, elem, by, idx) = + let( + dict = [["x", 0], ["y", 1], ["z", 2], ["i", idx]], + i = dict[search(by == "idx" ? "i" : by, dict)[0]][1] + ) + _binary_search_by(sorted, elem, 0, len(sorted) - 1, i); \ No newline at end of file diff --git a/src/util/bsearch.scad b/src/util/bsearch.scad index 893210bd..45f9b809 100644 --- a/src/util/bsearch.scad +++ b/src/util/bsearch.scad @@ -1,4 +1,5 @@ use ; -// for example, `sorted` is by zyx -function bsearch(sorted, elem) = _binary_search(sorted, elem, 0, len(sorted) - 1); \ No newline at end of file +function bsearch(sorted, elem, by = "idx", idx = 0) = + by == "vt" ? _bsearch_vt(sorted, elem, 0, len(sorted) - 1) : // for example, `sorted` is by zyx + _bsearch_by(sorted, elem, by, idx); \ No newline at end of file diff --git a/src/util/has.scad b/src/util/has.scad index 5accf856..e66c2d57 100644 --- a/src/util/has.scad +++ b/src/util/has.scad @@ -1,5 +1,5 @@ use ; function has(lt, elem, sorted = false) = - sorted ? bsearch(lt, elem) != -1 : + sorted ? bsearch(lt, elem, by = "vt") != -1 : search([elem], lt) != [[]]; \ No newline at end of file