| ... | ... | @@ -1,4 +1,5 @@ |
| 1 | 1 | const assert = @import("std").debug.assert; |
| 2 | const mem = @import("std").mem; // For mem.Compare |
| 2 | 3 | |
| 3 | 4 | const Color = enum(u1) { |
| 4 | 5 | Black, |
| ... | ... | @@ -7,12 +8,6 @@ const Color = enum(u1) { |
| 7 | 8 | const Red = Color.Red; |
| 8 | 9 | const Black = Color.Black; |
| 9 | 10 | |
| 10 | | const Compare = enum { |
| 11 | | LessThan, |
| 12 | | Equal, |
| 13 | | GreaterThan, |
| 14 | | }; |
| 15 | | |
| 16 | 11 | const ReplaceError = error { |
| 17 | 12 | NotEqual, |
| 18 | 13 | }; |
| ... | ... | @@ -134,7 +129,7 @@ pub const Node = struct { |
| 134 | 129 | |
| 135 | 130 | pub const Tree = struct { |
| 136 | 131 | root: ?*Node, |
| 137 | | compare_fn: fn(*Node, *Node) Compare, |
| 132 | compare_fn: fn(*Node, *Node) mem.Compare, |
| 138 | 133 | |
| 139 | 134 | pub fn first(tree: *Tree) ?*Node { |
| 140 | 135 | var node: *Node = tree.root orelse return null; |
| ... | ... | @@ -385,7 +380,7 @@ pub const Tree = struct { |
| 385 | 380 | var new = newconst; |
| 386 | 381 | |
| 387 | 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 | 385 | if (old.get_parent()) |parent| { |
| 391 | 386 | parent.set_child(new, parent.left == old); |
| ... | ... | @@ -400,7 +395,7 @@ pub const Tree = struct { |
| 400 | 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 | 399 | tree.root = null; |
| 405 | 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 | 460 | is_left.* = false; |
| 466 | 461 | |
| 467 | 462 | while (maybe_node) |node| { |
| 468 | | var res: Compare = tree.compare_fn(node, key); |
| 469 | | if (res == Compare.Equal) { |
| 463 | var res: mem.Compare = tree.compare_fn(node, key); |
| 464 | if (res == mem.Compare.Equal) { |
| 470 | 465 | return node; |
| 471 | 466 | } |
| 472 | 467 | pparent.* = node; |
| 473 | | if (res == Compare.GreaterThan) { |
| 468 | if (res == mem.Compare.GreaterThan) { |
| 474 | 469 | is_left.* = true; |
| 475 | 470 | maybe_node = node.left; |
| 476 | | } else if (res == Compare.LessThan) { |
| 471 | } else if (res == mem.Compare.LessThan) { |
| 477 | 472 | is_left.* = false; |
| 478 | 473 | maybe_node = node.right; |
| 479 | 474 | } else { |
| ... | ... | @@ -492,16 +487,16 @@ fn testGetNumber(node: *Node) *testNumber { |
| 492 | 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 | 491 | var left = testGetNumber(l); |
| 497 | 492 | var right = testGetNumber(r); |
| 498 | 493 | |
| 499 | 494 | if (left.value < right.value) { |
| 500 | | return Compare.LessThan; |
| 495 | return mem.Compare.LessThan; |
| 501 | 496 | } else if (left.value == right.value) { |
| 502 | | return Compare.Equal; |
| 497 | return mem.Compare.Equal; |
| 503 | 498 | } else if (left.value > right.value) { |
| 504 | | return Compare.GreaterThan; |
| 499 | return mem.Compare.GreaterThan; |
| 505 | 500 | } |
| 506 | 501 | unreachable; |
| 507 | 502 | } |