Skip to documentation
SLOP

tiny.smg.tree.runtime.selection

Reference tiny.smg tree runtime selection

Defined in tree.runtime.

API (5)

Actions

Public operations.

Types and contracts

Public types and contracts.

No direct callersNo direct callstree.runtimeselection
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Called byCallsprivate; no linktools.smg.src.tree.runtime.parserexpandCandidatetest; no linktools.smg.src.tree.runtime.selectiontest: focused accepted selection uses...tree.runtime.subtreeordertree.runtime.selectionconsider
Static calls · unresolved targets: 1 · external targets: 0.

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

Definitions6
Public names6
Members9
Version26.7.0
Revisiondaab053ee433