pub struct EntityScanner<'a> { /* private fields */ }Expand description
Fast entity scanner over raw IFC bytes without full parsing. O(n) performance for finding entities by type Uses memchr for SIMD-accelerated byte searching
Implementations§
Source§impl<'a> EntityScanner<'a>
impl<'a> EntityScanner<'a>
Sourcepub fn new<T>(content: &'a T) -> Self
pub fn new<T>(content: &'a T) -> Self
Create a new scanner.
Positions past the STEP HEADER section when one is present so that a
stray # inside a header string (e.g. a CATIA FILE_NAME like
'…\X0\2#.ifc') can’t be mistaken for an entity start and corrupt
quote-parity for the rest of the file (issue #654).
Sourcepub fn new_at<T>(content: &'a T, position: usize) -> Self
pub fn new_at<T>(content: &'a T, position: usize) -> Self
Create a scanner positioned at a specific byte offset.
Used by the sharded-scan pre-pass: each shard scans the full file
(so byte offsets returned are GLOBAL, not relative to the shard’s
range) but starts walking at its assigned start offset. Callers are
expected to rewind position to a known entity boundary (typically
the byte after a ;\n terminator) before calling next_entity.
Does NOT auto-skip the HEADER section — that’s the caller’s responsibility, since shards expect the exact offset they were given.
Sourcepub fn position(&self) -> usize
pub fn position(&self) -> usize
Current byte offset of the scanner (start of the next entity to scan).
Sourcepub fn next_entity(&mut self) -> Option<(u32, &'a str, usize, usize)>
pub fn next_entity(&mut self) -> Option<(u32, &'a str, usize, usize)>
Scan for the next entity Returns (entity_id, type_name, line_start, line_end)
Sourcepub fn find_by_type(&mut self, target_type: &str) -> Vec<(u32, usize, usize)>
pub fn find_by_type(&mut self, target_type: &str) -> Vec<(u32, usize, usize)>
Find all entities of a specific type
Sourcepub fn count_by_type(&mut self) -> FxHashMap<String, usize>
pub fn count_by_type(&mut self) -> FxHashMap<String, usize>
Count entities by type
Sourcepub fn count(&mut self) -> usize
pub fn count(&mut self) -> usize
Count the entities remaining from the scanner’s current position, without allocating anything per entity.
Unlike count_by_type (which builds a per-keyword
map) or build_entity_index (which retains a
span per entity, ~20 B each), this walks the byte stream and increments a
single counter: O(scan) time, O(1) memory. It is the cheap primitive
for a downstream entity-count DoS guard on a file too large to index
(issue #1517). Advances the scanner to the end of the data section.
Sourcepub fn has_non_null_attribute(
&self,
start: usize,
end: usize,
attr_index: usize,
) -> bool
pub fn has_non_null_attribute( &self, start: usize, end: usize, attr_index: usize, ) -> bool
Fast check if attribute at given index is non-null (not ‘$’) This is used to filter building elements that don’t have representation without full entity decode. Index 0 is first attribute after ‘(’.
Returns true if attribute exists and is not ‘$’, false otherwise.