tiny.smg.tree.runtime.selection
Defined in tree.runtime.
API (5)
Actions
Public operations.
Types and contracts
Public types and contracts.
Source
Source: tools/smg/src/tree/runtime/root.zig:7
zig
pub const selection = @import("selection.zig");Source: tools/smg/src/tree/runtime/selection.zig
zig
const std = @import("std");const runtime = @import("root.zig");const subtree = runtime.subtree;pub const Accepted = struct { root: *const subtree.Subtree, branch_precedence: i64,};pub const Decision = struct { existing_branch_precedence: ?i64, candidate_branch_precedence: i64, existing_root_precedence: ?i32, candidate_root_precedence: i32, order: ?std.math.Order, replace: bool,};pub const Trace = struct { decisions: std.ArrayList(Decision) = .empty, pub fn deinit(self: *Trace, allocator: std.mem.Allocator) void { self.decisions.deinit(allocator); self.* = .{}; }};pub fn consider( allocator: std.mem.Allocator, accepted: *?Accepted, candidate_root: *const subtree.Subtree, candidate_branch_precedence: i64, trace: ?*Trace,) !void { var tree_order: ?std.math.Order = null; const replace = if (accepted.*) |existing| replace: { if (candidate_root.dynamic_precedence > existing.root.dynamic_precedence) break :replace true; if (candidate_root.dynamic_precedence < existing.root.dynamic_precedence) break :replace false; tree_order = try subtree.order(allocator, existing.root, candidate_root); break :replace tree_order.? == .gt; } else true; if (trace) |value| { try value.decisions.append(allocator, .{ .existing_branch_precedence = if (accepted.*) |existing| existing.branch_precedence else null, .candidate_branch_precedence = candidate_branch_precedence, .existing_root_precedence = if (accepted.*) |existing| existing.root.dynamic_precedence else null, .candidate_root_precedence = candidate_root.dynamic_precedence, .order = tree_order, .replace = replace, }); } if (replace) accepted.* = .{ .root = candidate_root, .branch_precedence = candidate_branch_precedence };}test "focused accepted selection uses root dynamic precedence" { var retained = testSubtree(2); var lower = testSubtree(1); var higher = testSubtree(3); var accepted: ?Accepted = .{ .root = &retained, .branch_precedence = -10 }; try consider(std.testing.allocator, &accepted, &lower, 100, null); try std.testing.expectEqual(&retained, accepted.?.root); try consider(std.testing.allocator, &accepted, &higher, -100, null); try std.testing.expectEqual(&higher, accepted.?.root);}fn testSubtree(dynamic_precedence: i32) subtree.Subtree { return .{ .symbol = 1, .children = &.{}, .start = .{ .byte = 0, .point = .{ .row = 0, .column = 0 } }, .end = .{ .byte = 1, .point = .{ .row = 0, .column = 1 } }, .production_id = 0, .dynamic_precedence = dynamic_precedence, .parse_state = 1, .visible_descendant_count = 0, .named_descendant_count = 0, .visible = true, .named = true, .extra = false, .scanner_state = null, };}Audit
| Definitions | 6 |
|---|---|
| Public names | 6 |
| Members | 9 |
| Version | 26.7.0 |
| Revision | daab053ee433 |