authorgravatar for shawn@git.icuShawn Landden <shawn@git.icu> 2018-08-07 04:57:41-07:00
committergravatar for shawn@git.icuShawn Landden <shawn@git.icu> 2018-08-07 04:57:41-07:00
log86b512c5cd277a800c8333ed4206002316f4aca2
treefbbaa07c60593d0682af8a2fd6d317dbdff6d53b
parent5d2abf4402bdbd70eb95cf0d516ce12ff4202101

mem: move enum Compare from rb to mem


2 files changed, 18 insertions(+), 17 deletions(-)

std/mem.zig+6
...@@ -135,6 +135,12 @@ pub const Allocator = struct {...@@ -135,6 +135,12 @@ pub const Allocator = struct {
135 }135 }
136};136};
137137
138const Compare = enum {
139 LessThan,
140 Equal,
141 GreaterThan,
142};
143
138/// Copy all of source into dest at position 0.144/// Copy all of source into dest at position 0.
139/// dest.len must be >= source.len.145/// dest.len must be >= source.len.
140/// dest.ptr must be <= src.ptr.146/// dest.ptr must be <= src.ptr.
std/rb.zig+12-17
...@@ -1,4 +1,5 @@...@@ -1,4 +1,5 @@
1const assert = @import("std").debug.assert;1const assert = @import("std").debug.assert;
2const mem = @import("std").mem; // For mem.Compare
23
3const Color = enum(u1) {4const Color = enum(u1) {
4 Black,5 Black,
...@@ -7,12 +8,6 @@ const Color = enum(u1) {...@@ -7,12 +8,6 @@ const Color = enum(u1) {
7const Red = Color.Red;8const Red = Color.Red;
8const Black = Color.Black;9const Black = Color.Black;
910
10const Compare = enum {
11 LessThan,
12 Equal,
13 GreaterThan,
14};
15
16const ReplaceError = error {11const ReplaceError = error {
17 NotEqual,12 NotEqual,
18};13};
...@@ -134,7 +129,7 @@ pub const Node = struct {...@@ -134,7 +129,7 @@ pub const Node = struct {
134129
135pub const Tree = struct {130pub const Tree = struct {
136 root: ?*Node,131 root: ?*Node,
137 compare_fn: fn(*Node, *Node) Compare,132 compare_fn: fn(*Node, *Node) mem.Compare,
138133
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;
386381
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;
389384
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 }
402397
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;
466461
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}
494489
495fn testCompare(l: *Node, r: *Node) Compare {490fn 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);
498493
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}