@@ -11,6 +11,7 @@ import static io.opentelemetry.render.generator.RenderGenerator.generatedCodeWar
1111import static extension io.opentelemetry.render.extensions.AppExtensions.hashName
1212import static extension io.opentelemetry.render.extensions.AppExtensions.hashSize
1313import static extension io.opentelemetry.render.extensions.AppExtensions.hashFunctor
14+ import static extension io.opentelemetry.render.extensions.AppExtensions.pkg
1415
1516class HashGenerator {
1617
@@ -20,6 +21,8 @@ class HashGenerator {
2021
2122 fsa. generateFile(outputPath(app, " hash.c" ), generateC(app, hash))
2223 fsa. generateFile(outputPath(app, " hash.h" ), generateH(app, hash))
24+ // Rust port: generate perfect hash for rpc_id into src/hash.rs
25+ fsa. generateFile(outputPath(app, " src/hash.rs" ), generateRust(app, hash))
2326 }
2427
2528 private def generateC (App app , PerfectHash hash ) {
@@ -71,4 +74,36 @@ class HashGenerator {
7174 ' ' '
7275 }
7376
77+ private def generateRust (App app , PerfectHash hash ) {
78+ ' ' '
79+ «generatedCodeWarning()»
80+ // Perfect hash for RPC IDs for «app.pkg.name»::«app.name»
81+ //
82+ // g_type: «hash.g_type»
83+ // g_size: «hash.g_size»
84+ // g_shift: «hash.g_shift»
85+ // hash_shift: «hash.hash_shift»
86+ // hash_mask: «hash.hash_mask»
87+ // n_keys: «hash.n_keys»
88+ // multiplier: «hash.multiplier»
89+ // hash_seed: «hash.hash_seed»
90+
91+ #[allow(dead_code)]
92+ pub const «app.hashSize»: u32 = «hash.hash_mask + 1»u32;
93+
94+ #[allow(dead_code)]
95+ pub static G_ARRAY: [«hash.g_type»; «hash.g_size»] = [
96+ «hash.g_array.map[toString].join(",")»
97+ ];
98+
99+ #[inline]
100+ #[allow(dead_code)]
101+ pub fn «app.hashName»(rpc_id: u32) -> u32 {
102+ let k = (rpc_id ^ «hash.hash_seed»u32).wrapping_mul(«hash.multiplier»u32);
103+ let g = G_ARRAY[(k >> «hash.g_shift») as usize] as u32;
104+ (k >> «hash.hash_shift»).wrapping_add(g) & «hash.hash_mask»u32
105+ }
106+ ' ' '
107+ }
108+
74109}
0 commit comments