"use strict"; /* istanbul ignore file */ Object.defineProperty(exports, "__esModule", { value: true }); exports.instance = exports.GetByteLengthVisitor = void 0; const visitor_js_1 = require("../visitor.js"); const enum_js_1 = require("../enum.js"); /** @ignore */ const sum = (x, y) => x + y; /** @ignore */ class GetByteLengthVisitor extends visitor_js_1.Visitor { visitNull(____, _) { return 0; } visitInt(data, _) { return data.type.bitWidth / 8; } visitFloat(data, _) { return data.type.ArrayType.BYTES_PER_ELEMENT; } visitBool(____, _) { return 1 / 8; } visitDecimal(data, _) { return data.type.bitWidth / 8; } visitDate(data, _) { return (data.type.unit + 1) * 4; } visitTime(data, _) { return data.type.bitWidth / 8; } visitTimestamp(data, _) { return data.type.unit === enum_js_1.TimeUnit.SECOND ? 4 : 8; } visitInterval(data, _) { return (data.type.unit + 1) * 4; } visitStruct(data, i) { return data.children.reduce((total, child) => total + exports.instance.visit(child, i), 0); } visitFixedSizeBinary(data, _) { return data.type.byteWidth; } visitMap(data, i) { // 4 + 4 for the indices return 8 + data.children.reduce((total, child) => total + exports.instance.visit(child, i), 0); } visitDictionary(data, i) { var _a; return (data.type.indices.bitWidth / 8) + (((_a = data.dictionary) === null || _a === void 0 ? void 0 : _a.getByteLength(data.values[i])) || 0); } } exports.GetByteLengthVisitor = GetByteLengthVisitor; /** @ignore */ const getUtf8ByteLength = ({ valueOffsets }, index) => { // 4 + 4 for the indices, `end - start` for the data bytes return 8 + (valueOffsets[index + 1] - valueOffsets[index]); }; /** @ignore */ const getBinaryByteLength = ({ valueOffsets }, index) => { // 4 + 4 for the indices, `end - start` for the data bytes return 8 + (valueOffsets[index + 1] - valueOffsets[index]); }; /** @ignore */ const getListByteLength = ({ valueOffsets, stride, children }, index) => { const child = children[0]; const { [index * stride]: start } = valueOffsets; const { [index * stride + 1]: end } = valueOffsets; const visit = exports.instance.getVisitFn(child.type); const slice = child.slice(start, end - start); let size = 8; // 4 + 4 for the indices for (let idx = -1, len = end - start; ++idx < len;) { size += visit(slice, idx); } return size; }; /** @ignore */ const getFixedSizeListByteLength = ({ stride, children }, index) => { const child = children[0]; const slice = child.slice(index * stride, stride); const visit = exports.instance.getVisitFn(child.type); let size = 0; for (let idx = -1, len = slice.length; ++idx < len;) { size += visit(slice, idx); } return size; }; /* istanbul ignore next */ /** @ignore */ const getUnionByteLength = (data, index) => { return data.type.mode === enum_js_1.UnionMode.Dense ? getDenseUnionByteLength(data, index) : getSparseUnionByteLength(data, index); }; /** @ignore */ const getDenseUnionByteLength = ({ type, children, typeIds, valueOffsets }, index) => { const childIndex = type.typeIdToChildIndex[typeIds[index]]; // 4 for the typeId, 4 for the valueOffsets, then the child at the offset return 8 + exports.instance.visit(children[childIndex], valueOffsets[index]); }; /** @ignore */ const getSparseUnionByteLength = ({ children }, index) => { // 4 for the typeId, then once each for the children at this index return 4 + exports.instance.visitMany(children, children.map(() => index)).reduce(sum, 0); }; GetByteLengthVisitor.prototype.visitUtf8 = getUtf8ByteLength; GetByteLengthVisitor.prototype.visitBinary = getBinaryByteLength; GetByteLengthVisitor.prototype.visitList = getListByteLength; GetByteLengthVisitor.prototype.visitFixedSizeList = getFixedSizeListByteLength; GetByteLengthVisitor.prototype.visitUnion = getUnionByteLength; GetByteLengthVisitor.prototype.visitDenseUnion = getDenseUnionByteLength; GetByteLengthVisitor.prototype.visitSparseUnion = getSparseUnionByteLength; /** @ignore */ exports.instance = new GetByteLengthVisitor(); //# sourceMappingURL=bytelength.js.map