Add infrastructure to combine to WebAssembly
This commit is contained in:
parent
1b737755c9
commit
55b04efa85
|
@ -0,0 +1,9 @@
|
||||||
|
all: wordle_opt.wasm
|
||||||
|
|
||||||
|
wordle_opt.wasm: wordle_opt/target/wasm32-unknown-unknown/release/wordle_opt.wasm
|
||||||
|
#wasm-snip $< -o $@
|
||||||
|
cp $< $@
|
||||||
|
|
||||||
|
wordle_opt/target/wasm32-unknown-unknown/release/wordle_opt.wasm: wordle_opt/src/*.rs
|
||||||
|
cd wordle_opt; cargo build --target wasm32-unknown-unknown --release
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
target/
|
|
@ -0,0 +1,62 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "0.1.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.144"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memory_units"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wee_alloc"
|
||||||
|
version = "0.4.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"memory_units",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-i686-pc-windows-gnu",
|
||||||
|
"winapi-x86_64-pc-windows-gnu",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wordle_opt"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"wee_alloc",
|
||||||
|
]
|
|
@ -0,0 +1,17 @@
|
||||||
|
[package]
|
||||||
|
name = "wordle_opt"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["cdylib"]
|
||||||
|
bench = false
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
debug = true
|
||||||
|
lto = true
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
wee_alloc = "*"
|
|
@ -0,0 +1,82 @@
|
||||||
|
extern crate wee_alloc;
|
||||||
|
|
||||||
|
#[global_allocator]
|
||||||
|
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
|
||||||
|
|
||||||
|
|
||||||
|
// webassembly version of all the wordle logic
|
||||||
|
// because the javascript version is slow as hell on firefox
|
||||||
|
use std::os::raw::c_char;
|
||||||
|
|
||||||
|
static mut LOOKUP: Option<Vec<u8>> = None;
|
||||||
|
static mut STRINGS: Option<Vec<u8>> = None;
|
||||||
|
static mut STR_IDXS: Option<Vec<*const c_char>> = None;
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern fn init_strings(sz: usize) -> *mut c_char {
|
||||||
|
unsafe {
|
||||||
|
STRINGS = Some(vec![0u8; sz]);
|
||||||
|
STRINGS.as_deref_mut().map(|v| v.as_mut_ptr() as *mut c_char).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern fn init_idx() -> usize {
|
||||||
|
// TODO
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern fn init_lookup() -> *mut c_char {
|
||||||
|
unsafe {
|
||||||
|
let num_strings = STR_IDXS.as_ref().map(|idxs| idxs.len()).unwrap_or(0);
|
||||||
|
|
||||||
|
LOOKUP = Some(vec![0u8; num_strings*num_strings]);
|
||||||
|
LOOKUP.as_deref_mut().map(|v| v.as_mut_ptr() as *mut c_char).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern fn calc_match(guess: *const c_char, reference: *const c_char) -> u8 {
|
||||||
|
let mut unmatched = vec![0u8; 26];
|
||||||
|
let mut ret = 0;
|
||||||
|
let mut matched = 0;
|
||||||
|
|
||||||
|
let mut mul = 1;
|
||||||
|
for i in 0..5 {
|
||||||
|
unsafe {
|
||||||
|
if *(guess.offset(i)) == *(reference.offset(i)) {
|
||||||
|
ret += 1*mul;
|
||||||
|
matched |= 1 << i;
|
||||||
|
} else {
|
||||||
|
unmatched[*(reference.offset(i)) as usize - 'a' as usize] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mul *= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
mul = 1;
|
||||||
|
for i in 0..5 {
|
||||||
|
if (matched & (1 << i)) == 0 {
|
||||||
|
let idx = unsafe { *(guess.offset(i)) as usize - ('a' as usize) };
|
||||||
|
if unmatched[idx] > 0 {
|
||||||
|
ret += 2*mul;
|
||||||
|
unmatched[idx] -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mul *= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn it_works() {
|
||||||
|
let result = add(2, 2);
|
||||||
|
assert_eq!(result, 4);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue