| ... | @@ -1,4 +1,5 @@ | ... | @@ -1,4 +1,5 @@ |
| 1 | const assert = @import("std").debug.assert; | 1 | const assert = @import("std").debug.assert; |
| | 2 | const mem = @import("std").mem; // For mem.Compare |
| 2 | | 3 | |
| 3 | const Color = enum(u1) { | 4 | const Color = enum(u1) { |
| 4 | Black, | 5 | Black, |
| ... | @@ -7,12 +8,6 @@ const Color = enum(u1) { | ... | @@ -7,12 +8,6 @@ const Color = enum(u1) { |
| 7 | const Red = Color.Red; | 8 | const Red = Color.Red; |
| 8 | const Black = Color.Black; | 9 | const Black = Color.Black; |
| 9 | | 10 | |
| 10 | const Compare = enum { | | |
| 11 | LessThan, | | |
| 12 | Equal, | | |
| 13 | GreaterThan, | | |
| 14 | }; | | |
| 15 | | | |
| 16 | const ReplaceError = error { | 11 | const ReplaceError = error { |
| 17 | NotEqual, | 12 | NotEqual, |
| 18 | }; | 13 | }; |
| ... | @@ -134,7 +129,7 @@ pub const Node = struct { | ... | @@ -134,7 +129,7 @@ pub const Node = struct { |
| 134 | | 129 | |
| 135 | pub const Tree = struct { | 130 | pub const Tree = struct { |
| 136 | root: ?*Node, | 131 | root: ?*Node, |
| 137 | compare_fn: fn(*Node, *Node) Compare, | 132 | compare_fn: fn(*Node, *Node) mem.Compare, |
| 138 | | 133 | |
| 139 | pub fn first(tree: *Tree) ?*Node { | 134 | pub fn first(tree: *Tree) ?*Node { |
| 140 | var node: *Node = tree.root orelse return null; | 135 | var node: *Node = tree.root orelse return null; |
| ... | @@ -385,7 +380,7 @@ pub const Tree = struct { | ... | @@ -385,7 +380,7 @@ pub const Tree = struct { |
| 385 | var new = newconst; | 380 | var new = newconst; |
| 386 | | 381 | |
| 387 | // I assume this can get optimized out if the caller already knows. | 382 | // I assume this can get optimized out if the caller already knows. |
| 388 | if (tree.compare_fn(old, new) != Compare.Equal) return ReplaceError.NotEqual; | 383 | if (tree.compare_fn(old, new) != mem.Compare.Equal) return ReplaceError.NotEqual; |
| 389 | | 384 | |
| 390 | if (old.get_parent()) |parent| { | 385 | if (old.get_parent()) |parent| { |
| 391 | parent.set_child(new, parent.left == old); | 386 | parent.set_child(new, parent.left == old); |
| ... | @@ -400,7 +395,7 @@ pub const Tree = struct { | ... | @@ -400,7 +395,7 @@ pub const Tree = struct { |
| 400 | new.* = old.*; | 395 | new.* = old.*; |
| 401 | } | 396 | } |
| 402 | | 397 | |
| 403 | pub fn init(tree: *Tree, f: fn(*Node, *Node) Compare) void { | 398 | pub fn init(tree: *Tree, f: fn(*Node, *Node) mem.Compare) void { |
| 404 | tree.root = null; | 399 | tree.root = null; |
| 405 | tree.compare_fn = f; | 400 | tree.compare_fn = f; |
| 406 | } | 401 | } |
| ... | @@ -465,15 +460,15 @@ fn do_lookup(key: *Node, tree: *Tree, pparent: *?*Node, is_left: *bool) ?*Node { | ... | @@ -465,15 +460,15 @@ fn do_lookup(key: *Node, tree: *Tree, pparent: *?*Node, is_left: *bool) ?*Node { |
| 465 | is_left.* = false; | 460 | is_left.* = false; |
| 466 | | 461 | |
| 467 | while (maybe_node) |node| { | 462 | while (maybe_node) |node| { |
| 468 | var res: Compare = tree.compare_fn(node, key); | 463 | var res: mem.Compare = tree.compare_fn(node, key); |
| 469 | if (res == Compare.Equal) { | 464 | if (res == mem.Compare.Equal) { |
| 470 | return node; | 465 | return node; |
| 471 | } | 466 | } |
| 472 | pparent.* = node; | 467 | pparent.* = node; |
| 473 | if (res == Compare.GreaterThan) { | 468 | if (res == mem.Compare.GreaterThan) { |
| 474 | is_left.* = true; | 469 | is_left.* = true; |
| 475 | maybe_node = node.left; | 470 | maybe_node = node.left; |
| 476 | } else if (res == Compare.LessThan) { | 471 | } else if (res == mem.Compare.LessThan) { |
| 477 | is_left.* = false; | 472 | is_left.* = false; |
| 478 | maybe_node = node.right; | 473 | maybe_node = node.right; |
| 479 | } else { | 474 | } else { |
| ... | @@ -492,16 +487,16 @@ fn testGetNumber(node: *Node) *testNumber { | ... | @@ -492,16 +487,16 @@ fn testGetNumber(node: *Node) *testNumber { |
| 492 | return @fieldParentPtr(testNumber, "node", node); | 487 | return @fieldParentPtr(testNumber, "node", node); |
| 493 | } | 488 | } |
| 494 | | 489 | |
| 495 | fn testCompare(l: *Node, r: *Node) Compare { | 490 | fn testCompare(l: *Node, r: *Node) mem.Compare { |
| 496 | var left = testGetNumber(l); | 491 | var left = testGetNumber(l); |
| 497 | var right = testGetNumber(r); | 492 | var right = testGetNumber(r); |
| 498 | | 493 | |
| 499 | if (left.value < right.value) { | 494 | if (left.value < right.value) { |
| 500 | return Compare.LessThan; | 495 | return mem.Compare.LessThan; |
| 501 | } else if (left.value == right.value) { | 496 | } else if (left.value == right.value) { |
| 502 | return Compare.Equal; | 497 | return mem.Compare.Equal; |
| 503 | } else if (left.value > right.value) { | 498 | } else if (left.value > right.value) { |
| 504 | return Compare.GreaterThan; | 499 | return mem.Compare.GreaterThan; |
| 505 | } | 500 | } |
| 506 | unreachable; | 501 | unreachable; |
| 507 | } | 502 | } |