From bfb31cbc33716220b42bb398471840a4fbed0d89 Mon Sep 17 00:00:00 2001 From: Jose Colon Rodriguez Date: Mon, 12 Feb 2024 10:51:34 -0400 Subject: Using Trie super slow --- src/trie.zig | 49 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 9 deletions(-) (limited to 'src/trie.zig') diff --git a/src/trie.zig b/src/trie.zig index ee77954..8d2f258 100644 --- a/src/trie.zig +++ b/src/trie.zig @@ -1,11 +1,42 @@ const std = @import("std"); const mem = std.mem; -pub const Color = enum { red, blue }; +const gbp = @import("ziglyph").grapheme_break; + +pub const Prop = enum { + none, + control, + extend, + hangul_l, + hangul_lv, + hangul_lvt, + hangul_v, + hangul_t, + prepend, + regional, + spacing, + zwj, + + pub fn forCodePoint(cp: u21) Prop { + if (gbp.isControl(cp)) return .control; + if (gbp.isExtend(cp)) return .extend; + if (gbp.isL(cp)) return .hangul_l; + if (gbp.isLv(cp)) return .hangul_lv; + if (gbp.isLvt(cp)) return .hangul_lvt; + if (gbp.isT(cp)) return .hangul_t; + if (gbp.isV(cp)) return .hangul_v; + if (gbp.isPrepend(cp)) return .prepend; + if (gbp.isRegionalIndicator(cp)) return .regional; + if (gbp.isSpacingmark(cp)) return .spacing; + if (gbp.isZwj(cp)) return .zwj; + + return .none; + } +}; pub const Node = struct { children: [256]?*Node = [_]?*Node{null} ** 256, - value: ?Color = null, + value: ?Prop = null, }; pub const Trie = struct { @@ -26,7 +57,7 @@ pub const Trie = struct { bytes[0..]; } - pub fn put(self: *Trie, cp: u24, v: Color) !void { + pub fn put(self: *Trie, cp: u24, v: Prop) !void { const s = asBytes(cp); var current: *Node = &self.root; @@ -49,7 +80,7 @@ pub const Trie = struct { } } - pub fn get(self: Trie, cp: u24) ?Color { + pub fn get(self: Trie, cp: u24) ?Prop { const s = asBytes(cp); var current = &self.root; @@ -73,9 +104,9 @@ test "Trie works" { const cp_2: u21 = '\u{10ff}'; const cp_3: u21 = '\u{10}'; - try trie.put(cp_1, .red); - try trie.put(cp_3, .blue); - try std.testing.expectEqual(@as(?Color, .red), trie.get(cp_1)); - try std.testing.expectEqual(@as(?Color, null), trie.get(cp_2)); - try std.testing.expectEqual(@as(?Color, .blue), trie.get(cp_3)); + try trie.put(cp_1, .control); + try trie.put(cp_3, .zwj); + try std.testing.expectEqual(@as(?Prop, .control), trie.get(cp_1)); + try std.testing.expectEqual(@as(?Prop, null), trie.get(cp_2)); + try std.testing.expectEqual(@as(?Prop, .zwj), trie.get(cp_3)); } -- cgit v1.2.3