blob: 597ccf979c526b03f8ce21eb218b1d08760ed610 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
export interface IntervalMonthDayNanoObject<StringifyNano extends boolean = false> {
months: number;
days: number;
nanoseconds: StringifyNano extends true ? string : bigint | number;
}
export interface IntervalDayTimeObject {
days: number;
milliseconds: number;
}
export function toIntervalDayTimeInt32Array(objects: IntervalDayTimeObject[]) {
const length = objects.length;
const array = new Int32Array(length * 2);
for (let oi = 0, ai = 0; oi < length; oi++) {
const interval = objects[oi];
array[ai++] = interval['days'] ?? 0;
array[ai++] = interval['milliseconds'] ?? 0;
}
return array;
}
export function toIntervalMonthDayNanoInt32Array(objects: Partial<IntervalMonthDayNanoObject>[]) {
const length = objects.length;
const data = new Int32Array(length * 4);
for (let oi = 0, ai = 0; oi < length; oi++) {
const interval = objects[oi];
data[ai++] = interval['months'] ?? 0;
data[ai++] = interval['days'] ?? 0;
const nanoseconds = interval['nanoseconds'];
if (nanoseconds) {
const ns = BigInt(nanoseconds);
// Convert to unsigned 32-bit integers to avoid precision loss
data[ai++] = Number(ns & BigInt(0xFFFFFFFF)) >>> 0;
data[ai++] = Number(ns >> BigInt(32)) >>> 0;
} else {
ai += 2;
}
}
return data;
}
export function toIntervalDayTimeObjects(array: Int32Array): IntervalDayTimeObject[] {
const length = array.length;
const objects = new Array<IntervalDayTimeObject>(length / 2);
for (let ai = 0, oi = 0; ai < length; ai += 2) {
objects[oi++] = {
'days': array[ai],
'milliseconds': array[ai + 1]
};
}
return objects;
}
/** @ignore */
export function toIntervalMonthDayNanoObjects<StringifyNano extends boolean>(
array: Int32Array, stringifyNano: StringifyNano
): IntervalMonthDayNanoObject<StringifyNano>[] {
const length = array.length;
const objects = new Array<IntervalMonthDayNanoObject<StringifyNano>>(length / 4);
for (let ai = 0, oi = 0; ai < length; ai += 4) {
const nanoseconds = (BigInt(array[ai + 3]) << BigInt(32)) | BigInt(array[ai + 2] >>> 0);
objects[oi++] = {
'months': array[ai],
'days': array[ai + 1],
'nanoseconds': (stringifyNano ? `${nanoseconds}` : nanoseconds) as IntervalMonthDayNanoObject<StringifyNano>['nanoseconds'],
};
}
return objects;
}