rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
185 lines (182 loc) • 3.99 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.boundEQ = boundEQ;
exports.boundEQByIndexString = boundEQByIndexString;
exports.boundGE = boundGE;
exports.boundGEByIndexString = boundGEByIndexString;
exports.boundGT = boundGT;
exports.boundGTByIndexString = boundGTByIndexString;
exports.boundLE = boundLE;
exports.boundLEByIndexString = boundLEByIndexString;
exports.boundLT = boundLT;
exports.boundLTByIndexString = boundLTByIndexString;
/**
* Optimized binary search functions for the memory storage.
* Based on https://github.com/mikolalysenko/binary-search-bounds
* but with performance improvements:
* - Removed unnecessary undefined checks for comparator
* - Inlined the norm() wrapper to avoid extra function calls
* - Added string-specialized variants to avoid temporary array allocations
*/
function boundGE(a, y, c, lo, hi) {
var l = lo === undefined ? 0 : lo | 0;
var h = hi === undefined ? a.length - 1 : hi | 0;
var i = h + 1;
while (l <= h) {
var m = l + h >>> 1;
if (c(a[m], y) >= 0) {
i = m;
h = m - 1;
} else {
l = m + 1;
}
}
return i;
}
function boundGT(a, y, c, lo, hi) {
var l = lo === undefined ? 0 : lo | 0;
var h = hi === undefined ? a.length - 1 : hi | 0;
var i = h + 1;
while (l <= h) {
var m = l + h >>> 1;
if (c(a[m], y) > 0) {
i = m;
h = m - 1;
} else {
l = m + 1;
}
}
return i;
}
function boundLT(a, y, c, lo, hi) {
var l = lo === undefined ? 0 : lo | 0;
var h = hi === undefined ? a.length - 1 : hi | 0;
var i = l - 1;
while (l <= h) {
var m = l + h >>> 1;
if (c(a[m], y) < 0) {
i = m;
l = m + 1;
} else {
h = m - 1;
}
}
return i;
}
function boundLE(a, y, c, lo, hi) {
var l = lo === undefined ? 0 : lo | 0;
var h = hi === undefined ? a.length - 1 : hi | 0;
var i = l - 1;
while (l <= h) {
var m = l + h >>> 1;
if (c(a[m], y) <= 0) {
i = m;
l = m + 1;
} else {
h = m - 1;
}
}
return i;
}
function boundEQ(a, y, c, lo, hi) {
var l = lo === undefined ? 0 : lo | 0;
var h = hi === undefined ? a.length - 1 : hi | 0;
while (l <= h) {
var m = l + h >>> 1;
var p = c(a[m], y);
if (p === 0) {
return m;
}
if (p <= 0) {
l = m + 1;
} else {
h = m - 1;
}
}
return -1;
}
/**
* Specialized binary search functions that compare DocWithIndexString
* entries directly against an index string, avoiding temporary array allocations.
* Used in query() and count() hot paths.
*/
function boundGEByIndexString(a, indexString) {
var l = 0;
var h = a.length - 1;
var i = h + 1;
while (l <= h) {
var m = l + h >>> 1;
if (a[m][0] >= indexString) {
i = m;
h = m - 1;
} else {
l = m + 1;
}
}
return i;
}
function boundGTByIndexString(a, indexString) {
var l = 0;
var h = a.length - 1;
var i = h + 1;
while (l <= h) {
var m = l + h >>> 1;
if (a[m][0] > indexString) {
i = m;
h = m - 1;
} else {
l = m + 1;
}
}
return i;
}
function boundEQByIndexString(a, indexString) {
var l = 0;
var h = a.length - 1;
while (l <= h) {
var m = l + h >>> 1;
var s = a[m][0];
if (s === indexString) {
return m;
}
if (s < indexString) {
l = m + 1;
} else {
h = m - 1;
}
}
return -1;
}
function boundLTByIndexString(a, indexString) {
var l = 0;
var h = a.length - 1;
var i = l - 1;
while (l <= h) {
var m = l + h >>> 1;
if (a[m][0] < indexString) {
i = m;
l = m + 1;
} else {
h = m - 1;
}
}
return i;
}
function boundLEByIndexString(a, indexString) {
var l = 0;
var h = a.length - 1;
var i = l - 1;
while (l <= h) {
var m = l + h >>> 1;
if (a[m][0] <= indexString) {
i = m;
l = m + 1;
} else {
h = m - 1;
}
}
return i;
}
//# sourceMappingURL=binary-search-bounds.js.map