@bldrs-ai/conway 1.445.1339 → 1.448.1345

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
+ import { skipValue, stepExtractArrayBegin, stepExtractArrayToken, stepExtractNumber, stepExtractOptional, } from "./step_deserialization_functions.js";
1
2
  /**
2
3
  * Growable Uint32Array append sink.
3
4
  *
@@ -48,3 +49,37 @@ export class Uint32Sink {
48
49
  this.data_[this.length_++] = value;
49
50
  }
50
51
  }
52
+ /**
53
+ * Parse a STEP integer list at `cursor` into `sink`, appending in order.
54
+ *
55
+ * The single implementation shared by the entity-level and
56
+ * reference-level fast paths, so they cannot drift from each other or
57
+ * from the generated array getters they stand in for (same optional
58
+ * handling, same element extraction, same "incorrectly typed" error).
59
+ *
60
+ * @param buffer The record's buffer window.
61
+ * @param cursor Start of the field.
62
+ * @param endCursor End bound for extraction.
63
+ * @param sink Receives the appended values.
64
+ * @return {number} How many values were appended (0 when unset/optional-null).
65
+ */
66
+ export function extractIntegerArrayAt(buffer, cursor, endCursor, sink) {
67
+ if (stepExtractOptional(buffer, cursor, endCursor) === null) {
68
+ return 0;
69
+ }
70
+ let count = 0;
71
+ let signedCursor0 = stepExtractArrayBegin(buffer, cursor, endCursor);
72
+ let readCursor = Math.abs(signedCursor0);
73
+ while (signedCursor0 >= 0) {
74
+ const value = stepExtractNumber(buffer, readCursor, endCursor);
75
+ if (value === void 0) {
76
+ throw new Error("Value in STEP was incorrectly typed");
77
+ }
78
+ readCursor = skipValue(buffer, readCursor, endCursor);
79
+ sink.push(value);
80
+ ++count;
81
+ signedCursor0 = stepExtractArrayToken(buffer, readCursor, endCursor);
82
+ readCursor = Math.abs(signedCursor0);
83
+ }
84
+ return count;
85
+ }
@@ -5,7 +5,8 @@
5
5
  import * as fs from "fs";
6
6
  import { beforeAll, describe, expect, test } from "@jest/globals";
7
7
  import { IfcAPI } from "../../compat/web-ifc/ifc_api.js";
8
- import { IfcIndexedPolygonalFace, IfcIndexedPolygonalFaceWithVoids, } from "../../ifc/ifc4_gen/index.js";
8
+ import EntityTypesIfc from "../../ifc/ifc4_gen/entity_types_ifc.gen.js";
9
+ import { IfcIndexedPolygonalFace, IfcIndexedPolygonalFaceWithVoids, IfcPolygonalFaceSet, } from "../../ifc/ifc4_gen/index.js";
9
10
  import { Uint32Sink } from "./uint32_sink.js";
10
11
  describe("Uint32Sink", () => {
11
12
  test("appends, grows past its initial capacity, and views exactly its length", () => {
@@ -75,3 +76,84 @@ describe("extractIntegerArrayInto", () => {
75
76
  expect(Array.from(sink.view)).toEqual(expected);
76
77
  }, 120000);
77
78
  });
79
+ // The reference-level path the faceset extraction uses to avoid
80
+ // constructing an entity per face. It must agree with the generated
81
+ // getters exactly, and must report failure (rather than guess) whenever
82
+ // its preconditions don't hold, because the caller's fallback depends on
83
+ // that signal.
84
+ describe("reference-level faceset fast path", () => {
85
+ const FACES_OFFSET = 2;
86
+ const FACES_BASE_OFFSET = 1;
87
+ const FACES_DEPTH = 4;
88
+ const COORD_INDEX_OFFSET = 0;
89
+ let api;
90
+ let modelID;
91
+ /**
92
+ * @return {object} The StepModel behind the passthrough tuple.
93
+ */
94
+ function stepModel() {
95
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
+ return api.models.get(modelID).model[0];
97
+ }
98
+ /**
99
+ * @return {IfcPolygonalFaceSet[]} The fixture's facesets.
100
+ */
101
+ function faceSets() {
102
+ return Array.from(stepModel().types(IfcPolygonalFaceSet));
103
+ }
104
+ beforeAll(async () => {
105
+ api = new IfcAPI();
106
+ await api.Init();
107
+ modelID = api.OpenModel(new Uint8Array(fs.readFileSync("data/index.ifc")), { COORDINATE_TO_ORIGIN: true, USE_FAST_BOOLS: true });
108
+ }, 120000);
109
+ test("forEachReferenceInField yields exactly the express IDs the Faces getter resolves", () => {
110
+ const sets = faceSets();
111
+ expect(sets.length).toBeGreaterThan(0);
112
+ for (const faceSet of sets) {
113
+ const walked = [];
114
+ const completed = faceSet.forEachReferenceInField(FACES_OFFSET, FACES_BASE_OFFSET, FACES_DEPTH, (expressID) => {
115
+ walked.push(expressID);
116
+ return true;
117
+ });
118
+ expect(completed).toBe(true);
119
+ expect(walked).toEqual(faceSet.Faces.map((face) => face.expressID));
120
+ }
121
+ }, 120000);
122
+ test("forEachReferenceInField stops when the callback returns false", () => {
123
+ const faceSet = faceSets()[0];
124
+ const walked = [];
125
+ const completed = faceSet.forEachReferenceInField(FACES_OFFSET, FACES_BASE_OFFSET, FACES_DEPTH, (expressID) => {
126
+ walked.push(expressID);
127
+ return false;
128
+ });
129
+ expect(completed).toBe(false);
130
+ expect(walked.length).toBe(1);
131
+ }, 120000);
132
+ test("extractIntegerArrayByExpressIDInto matches the generated CoordIndex getter", () => {
133
+ const model = stepModel();
134
+ const sink = new Uint32Sink(4);
135
+ for (const faceSet of faceSets()) {
136
+ for (const face of faceSet.Faces) {
137
+ if (face instanceof IfcIndexedPolygonalFaceWithVoids) {
138
+ continue;
139
+ }
140
+ sink.reset();
141
+ const count = model.extractIntegerArrayByExpressIDInto(face.expressID, COORD_INDEX_OFFSET, EntityTypesIfc.IFCINDEXEDPOLYGONALFACE, sink);
142
+ expect(count).toBe(face.CoordIndex.length);
143
+ expect(Array.from(sink.view)).toEqual(face.CoordIndex);
144
+ }
145
+ }
146
+ }, 120000);
147
+ test("reports failure for an unknown express ID and for a type mismatch", () => {
148
+ const model = stepModel();
149
+ const sink = new Uint32Sink(4);
150
+ const face = faceSets()[0].Faces[0];
151
+ // Unknown record: the caller must fall back, not read something else.
152
+ expect(model.extractIntegerArrayByExpressIDInto(268435455, COORD_INDEX_OFFSET, EntityTypesIfc.IFCINDEXEDPOLYGONALFACE, sink))
153
+ .toBeUndefined();
154
+ // Right record, wrong expected type: field offsets would not be
155
+ // comparable, so this must refuse rather than misread the record.
156
+ expect(model.extractIntegerArrayByExpressIDInto(face.expressID, COORD_INDEX_OFFSET, EntityTypesIfc.IFCPOLYGONALFACESET, sink))
157
+ .toBeUndefined();
158
+ }, 120000);
159
+ });
@@ -326,6 +326,26 @@ export default abstract class StepEntityBase<EntityTypeIDs extends number> imple
326
326
  * @return {number} How many values were appended (0 when the field is
327
327
  * unset/optional-null).
328
328
  */
329
+ /**
330
+ * Walk a reference-list field, handing each element's express ID to
331
+ * `onReference` without resolving it to an entity.
332
+ *
333
+ * Lets hot loops decide per element how to read the referenced record
334
+ * (see StepModelBase.extractIntegerArrayByExpressIDInto) instead of
335
+ * paying for an entity per element the way the generated list getters
336
+ * do. Inline (non-reference) elements yield `undefined`, and
337
+ * `onReference` returning false aborts the walk — together those let
338
+ * a caller bail out to the generated getter for anything it is not
339
+ * prepared to handle.
340
+ *
341
+ * @param offset The offset in the vtable to extract from.
342
+ * @param baseOffset The base offset of the class in the vtable.
343
+ * @param depth The depth in the inheritance hierarchy.
344
+ * @param onReference Receives each element's express ID, or undefined
345
+ * for an inline element; return false to abort.
346
+ * @return {boolean} False if the walk was aborted, true otherwise.
347
+ */
348
+ forEachReferenceInField(offset: number, baseOffset: number, depth: number, onReference: (expressID: number | undefined) => boolean): boolean;
329
349
  extractIntegerArrayInto(offset: number, baseOffset: number, depth: number, sink: Uint32Sink): number;
330
350
  /**
331
351
  * Extract a number at the particular vtable offset (i.e. the position
@@ -1 +1 @@
1
- {"version":3,"file":"step_entity_base.d.ts","sourceRoot":"","sources":["../../../src/step/step_entity_base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"step_entity_base.d.ts","sourceRoot":"","sources":["../../../src/step/step_entity_base.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { skipValue, stepExtractArray, stepExtractArrayBegin, stepExtractArrayToken, stepExtractBinary, stepExtractBoolean, stepExtractInlineElemement, stepExtractLogical, stepExtractNumber, stepExtractOptional, stepExtractReference, stepExtractString, } from "./parsing/step_deserialization_functions.js";
2
+ import { extractIntegerArrayAt } from "./parsing/uint32_sink.js";
2
3
  import { stepBufferBase } from "./step_buffer_provider.js";
3
4
  var IfcTokenType;
4
5
  (function (IfcTokenType) {
@@ -467,28 +468,48 @@ export default class StepEntityBase {
467
468
  * @return {number} How many values were appended (0 when the field is
468
469
  * unset/optional-null).
469
470
  */
470
- extractIntegerArrayInto(offset, baseOffset, depth, sink) {
471
+ /**
472
+ * Walk a reference-list field, handing each element's express ID to
473
+ * `onReference` without resolving it to an entity.
474
+ *
475
+ * Lets hot loops decide per element how to read the referenced record
476
+ * (see StepModelBase.extractIntegerArrayByExpressIDInto) instead of
477
+ * paying for an entity per element the way the generated list getters
478
+ * do. Inline (non-reference) elements yield `undefined`, and
479
+ * `onReference` returning false aborts the walk — together those let
480
+ * a caller bail out to the generated getter for anything it is not
481
+ * prepared to handle.
482
+ *
483
+ * @param offset The offset in the vtable to extract from.
484
+ * @param baseOffset The base offset of the class in the vtable.
485
+ * @param depth The depth in the inheritance hierarchy.
486
+ * @param onReference Receives each element's express ID, or undefined
487
+ * for an inline element; return false to abort.
488
+ * @return {boolean} False if the walk was aborted, true otherwise.
489
+ */
490
+ forEachReferenceInField(offset, baseOffset, depth, onReference) {
471
491
  let cursor = this.getOffsetCursor(offset, baseOffset, depth);
472
492
  const buffer = this.buffer;
473
493
  const endCursor = buffer.length;
474
494
  if (stepExtractOptional(buffer, cursor, endCursor) === null) {
475
- return 0;
495
+ return true;
476
496
  }
477
- let count = 0;
478
497
  let signedCursor0 = stepExtractArrayBegin(buffer, cursor, endCursor);
479
498
  cursor = Math.abs(signedCursor0);
480
499
  while (signedCursor0 >= 0) {
481
- const value = stepExtractNumber(buffer, cursor, endCursor);
482
- if (value === void 0) {
483
- throw new Error("Value in STEP was incorrectly typed");
500
+ if (!onReference(stepExtractReference(buffer, cursor, endCursor))) {
501
+ return false;
484
502
  }
485
503
  cursor = skipValue(buffer, cursor, endCursor);
486
- sink.push(value);
487
- ++count;
488
504
  signedCursor0 = stepExtractArrayToken(buffer, cursor, endCursor);
489
505
  cursor = Math.abs(signedCursor0);
490
506
  }
491
- return count;
507
+ return true;
508
+ }
509
+ extractIntegerArrayInto(offset, baseOffset, depth, sink) {
510
+ const cursor = this.getOffsetCursor(offset, baseOffset, depth);
511
+ const buffer = this.buffer;
512
+ return extractIntegerArrayAt(buffer, cursor, buffer.length, sink);
492
513
  }
493
514
  /**
494
515
  * Extract a number at the particular vtable offset (i.e. the position
@@ -3,6 +3,7 @@ import { StepIndexColumns } from "./parsing/columnar_index.js";
3
3
  import { StepBufferProvider, StepExternalByteStore } from "./step_buffer_provider.js";
4
4
  import StepEntityBase from "./step_entity_base.js";
5
5
  import StepEntitySchema from "./step_entity_schema.js";
6
+ import { Uint32Sink } from "./parsing/uint32_sink.js";
6
7
  import StepEntityInternalReference from "./step_entity_internal_reference.js";
7
8
  import { IIndexSetCursor } from "../core/i_index_set_cursor.js";
8
9
  import { MultiIndexSet } from "../indexing/multi_index_set.js";
@@ -95,6 +96,30 @@ export default abstract class StepModelBase<EntityTypeIDs extends number, BaseEn
95
96
  * @param element The raw elment to populate the vtable entry for.
96
97
  * @return {boolean} Did the vtable entry populate correctly?
97
98
  */
99
+ /**
100
+ * Append a referenced record's unsigned-integer list field into `sink`
101
+ * without materialising the referenced entity.
102
+ *
103
+ * This is the reference-level twin of
104
+ * `StepEntityBase.extractIntegerArrayInto`, for hot loops that walk
105
+ * millions of small records (tessellated facesets) where constructing
106
+ * an entity per record dominates. It deliberately handles only the
107
+ * simple case and reports failure otherwise, so callers keep a
108
+ * correct fallback rather than this growing subtle special cases:
109
+ * the reference must resolve, be single-class (no multi-mapping),
110
+ * and be exactly `expectedTypeID` — which is what makes reading
111
+ * `offset` as a plain vtable slot equivalent to the generated
112
+ * getter's `getOffsetCursor( offset, _, _ )` (that only subtracts a
113
+ * base offset for multi-mapped records).
114
+ *
115
+ * @param expressID The referenced record's express ID.
116
+ * @param offset The field's vtable offset within the record.
117
+ * @param expectedTypeID The type the record must be.
118
+ * @param sink Receives the appended values.
119
+ * @return {number | undefined} Count appended, or undefined when the
120
+ * fast path does not apply and the caller must fall back.
121
+ */
122
+ extractIntegerArrayByExpressIDInto(expressID: number, offset: number, expectedTypeID: EntityTypeIDs, sink: Uint32Sink): number | undefined;
98
123
  populateVtableEntryRaw(element: StepEntityInternalReference<EntityTypeIDs>): boolean;
99
124
  /**
100
125
  * Force the population of the the vtable entry for a particular ID
@@ -1 +1 @@
1
- {"version":3,"file":"step_model_base.d.ts","sourceRoot":"","sources":["../../../src/step/step_model_base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"step_model_base.d.ts","sourceRoot":"","sources":["../../../src/step/step_model_base.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { releaseScratchParsingBuffer } from "./parsing/step_deserialization_functions.js";
2
2
  import { ResidentStepBufferProvider, WindowedStepBufferProvider, } from "./step_buffer_provider.js";
3
3
  import StepVtableBuilder from "./parsing/step_vtable_builder.js";
4
+ import { extractIntegerArrayAt } from "./parsing/uint32_sink.js";
4
5
  import { extractOneHotLow } from "../indexing/bit_operations.js";
5
6
  import { TriangleElementMap } from "../core/triangle_element_map.js";
6
7
  import InterpolationSearchTable32 from "../indexing/interpolation_search_table_32.js";
@@ -246,6 +247,53 @@ export default class StepModelBase {
246
247
  * @param element The raw elment to populate the vtable entry for.
247
248
  * @return {boolean} Did the vtable entry populate correctly?
248
249
  */
250
+ /**
251
+ * Append a referenced record's unsigned-integer list field into `sink`
252
+ * without materialising the referenced entity.
253
+ *
254
+ * This is the reference-level twin of
255
+ * `StepEntityBase.extractIntegerArrayInto`, for hot loops that walk
256
+ * millions of small records (tessellated facesets) where constructing
257
+ * an entity per record dominates. It deliberately handles only the
258
+ * simple case and reports failure otherwise, so callers keep a
259
+ * correct fallback rather than this growing subtle special cases:
260
+ * the reference must resolve, be single-class (no multi-mapping),
261
+ * and be exactly `expectedTypeID` — which is what makes reading
262
+ * `offset` as a plain vtable slot equivalent to the generated
263
+ * getter's `getOffsetCursor( offset, _, _ )` (that only subtracts a
264
+ * base offset for multi-mapped records).
265
+ *
266
+ * @param expressID The referenced record's express ID.
267
+ * @param offset The field's vtable offset within the record.
268
+ * @param expectedTypeID The type the record must be.
269
+ * @param sink Receives the appended values.
270
+ * @return {number | undefined} Count appended, or undefined when the
271
+ * fast path does not apply and the caller must fall back.
272
+ */
273
+ extractIntegerArrayByExpressIDInto(expressID, offset, expectedTypeID, sink) {
274
+ const localID = this.expressIDMap_.get(expressID);
275
+ if (localID === void 0 || localID >= this.count_) {
276
+ return void 0;
277
+ }
278
+ const element = this.entry(localID);
279
+ // Multi-mapped records need per-depth base offsets; leave them to
280
+ // the generated getters.
281
+ if (element.multiMapping !== void 0 || element.typeID !== expectedTypeID) {
282
+ return void 0;
283
+ }
284
+ if (element.vtableIndex === void 0 && !this.populateVtableEntryRaw(element)) {
285
+ return void 0;
286
+ }
287
+ const vtable = element.vtable;
288
+ const buffer = element.buffer;
289
+ if (vtable === void 0 || buffer === void 0 ||
290
+ offset >= (element.vtableCount ?? 0)) {
291
+ return void 0;
292
+ }
293
+ // Same window the vtable cursors were recorded against, and the
294
+ // same end bound the generated array getters use.
295
+ return extractIntegerArrayAt(buffer, vtable[element.vtableIndex + offset], buffer.length, sink);
296
+ }
249
297
  populateVtableEntryRaw(element) {
250
298
  if (element.vtableIndex !== void 0 || element.typeID === 0) {
251
299
  return true;
@@ -5,5 +5,5 @@
5
5
  // only the first segment (major) is meaningful and is the one CI carries forward.
6
6
  // Must stay in `vN.N.N` shape: the CI stamp regex, scripts/updateVersion.mjs, and
7
7
  // statistics.ts all match `v\d+\.\d+\.\d+`.
8
- const versionString = 'Conway v1.445.1339';
8
+ const versionString = 'Conway v1.448.1345';
9
9
  export { versionString };