mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-17 12:10:47 +02:00
support by and idx
This commit is contained in:
@@ -1,7 +1,20 @@
|
||||
use <util/_impl/_vt_default_comparator.scad>;
|
||||
|
||||
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;
|
||||
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);
|
@@ -1,4 +1,5 @@
|
||||
use <util/_impl/_bsearch_impl.scad>;
|
||||
|
||||
// for example, `sorted` is by zyx
|
||||
function bsearch(sorted, elem) = _binary_search(sorted, elem, 0, len(sorted) - 1);
|
||||
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);
|
@@ -1,5 +1,5 @@
|
||||
use <util/bsearch.scad>;
|
||||
|
||||
function has(lt, elem, sorted = false) =
|
||||
sorted ? bsearch(lt, elem) != -1 :
|
||||
sorted ? bsearch(lt, elem, by = "vt") != -1 :
|
||||
search([elem], lt) != [[]];
|
Reference in New Issue
Block a user