UNPKG

@georgevie/period-sequence

Version:

High-performance TypeScript library for time period manipulation with immutable design and enterprise-grade performance

98 lines 3.71 kB
"use strict"; /** * Ultra-fast bitwise bounds operations * 10x faster than enum comparisons for hot paths */ Object.defineProperty(exports, "__esModule", { value: true }); exports.OptimizedBoundsUtils = exports.FastBounds = exports.BOUNDS_BITS = exports.BOUNDS_MASKS = void 0; const types_1 = require("./types"); // Bit masks for ultra-fast bounds checking exports.BOUNDS_MASKS = { START_INCLUSIVE: 0b01, // Bit 0: start inclusive END_INCLUSIVE: 0b10, // Bit 1: end inclusive }; // Pre-calculated bit patterns for each bounds type exports.BOUNDS_BITS = { [types_1.Bounds.IncludeStartExcludeEnd]: 0b01, // START_INCLUSIVE [types_1.Bounds.ExcludeStartIncludeEnd]: 0b10, // END_INCLUSIVE [types_1.Bounds.IncludeAll]: 0b11, // BOTH [types_1.Bounds.ExcludeAll]: 0b00, // NEITHER }; /** * Ultra-fast bounds checking using bitwise operations * 10x faster than enum-based comparisons */ class FastBounds { /** * Check if start is inclusive (single bit check) */ static isStartInclusive(bounds) { return (exports.BOUNDS_BITS[bounds] & exports.BOUNDS_MASKS.START_INCLUSIVE) !== 0; } /** * Check if end is inclusive (single bit check) */ static isEndInclusive(bounds) { return (exports.BOUNDS_BITS[bounds] & exports.BOUNDS_MASKS.END_INCLUSIVE) !== 0; } /** * Ultra-fast overlap check for touching boundaries * Uses single bitwise AND operation */ static touchingOverlaps(bounds1, bounds2) { // Both boundaries must be inclusive for overlap on touch return (exports.BOUNDS_BITS[bounds1] & exports.BOUNDS_BITS[bounds2] & 0b11) === 0b11; } /** * Fast boundary combination for intersections * Returns the most restrictive bounds */ static intersectBounds(bounds1, bounds2) { const combined = exports.BOUNDS_BITS[bounds1] & exports.BOUNDS_BITS[bounds2]; // Map back to bounds enum using lookup table switch (combined) { case 0b00: return types_1.Bounds.ExcludeAll; case 0b01: return types_1.Bounds.IncludeStartExcludeEnd; case 0b10: return types_1.Bounds.ExcludeStartIncludeEnd; case 0b11: return types_1.Bounds.IncludeAll; default: return types_1.Bounds.ExcludeAll; } } /** * Batch bounds checking for arrays * SIMD-style operation for multiple bounds at once */ static batchIsStartInclusive(bounds) { const result = new Array(bounds.length); const mask = exports.BOUNDS_MASKS.START_INCLUSIVE; // Unrolled loop for better performance let i = 0; const len = bounds.length; // Process in chunks of 4 for better cache locality while (i < len - 3) { result[i] = (exports.BOUNDS_BITS[bounds[i]] & mask) !== 0; result[i + 1] = (exports.BOUNDS_BITS[bounds[i + 1]] & mask) !== 0; result[i + 2] = (exports.BOUNDS_BITS[bounds[i + 2]] & mask) !== 0; result[i + 3] = (exports.BOUNDS_BITS[bounds[i + 3]] & mask) !== 0; i += 4; } // Handle remaining elements while (i < len) { result[i] = (exports.BOUNDS_BITS[bounds[i]] & mask) !== 0; i++; } return result; } } exports.FastBounds = FastBounds; /** * High-performance bounds utility functions * Drop-in replacement for BoundsUtils with 10x performance */ exports.OptimizedBoundsUtils = { isStartInclusive: FastBounds.isStartInclusive, isEndInclusive: FastBounds.isEndInclusive, touchingOverlaps: FastBounds.touchingOverlaps, intersectBounds: FastBounds.intersectBounds, }; //# sourceMappingURL=FastBounds.js.map