Skip to main content

Crate wick_cond

Crate wick_cond 

Source
Expand description

Backend helpers for conditionals, comparisons, and boolean logic.

This crate provides code generation utilities that domain crates use to emit conditional expressions to various backends (WGSL, Lua, Cranelift). Rather than each domain crate reimplementing backend-specific conditional logic, they can delegate to these shared helpers.

§Architecture

dew-core (AST: Compare, And, Or, If)
    │
    ▼
dew-cond (backend helpers)
    │
    ├── wgsl::emit_compare, emit_if, ...
    ├── glsl::emit_compare, emit_if, ...
    ├── rust::emit_compare, emit_if, ...
    ├── lua::emit_compare, emit_if, ...
    └── cranelift::emit_compare, emit_if, ...
    │
    ▼
domain crates (dew-scalar, dew-linalg, dew-complex, dew-quaternion)
    use dew-cond helpers in their backend modules

§Features

FeatureDescription
wgslWGSL code generation helpers
lua-codegenLua code generation (pure Rust)
luaAlias for lua-codegen
craneliftCranelift JIT compilation helpers

§Backend Modules

Each backend module provides the same set of functions with backend-specific implementations:

FunctionDescription
emit_compareComparison operators (<, <=, >, >=, ==, !=)
emit_andLogical AND
emit_orLogical OR
emit_notLogical NOT
emit_ifConditional expression (if/then/else)
scalar_to_boolConvert numeric value to boolean
bool_to_scalarConvert boolean to numeric (1.0/0.0)

§Examples

§WGSL Backend

use wick_cond::{wgsl, CompareOp};

// Comparison
let code = wgsl::emit_compare(CompareOp::Lt, "a", "b");
assert_eq!(code, "(a < b)");

// Conditional (uses WGSL's select function)
let code = wgsl::emit_if("cond", "then_val", "else_val");
assert_eq!(code, "select(else_val, then_val, cond)");

// Boolean logic
let code = wgsl::emit_and("x > 0.0", "y > 0.0");
assert_eq!(code, "(x > 0.0 && y > 0.0)");

§Lua Backend

use wick_cond::{lua, CompareOp};

// Comparison (note: Lua uses ~= for not-equal)
let code = lua::emit_compare(CompareOp::Ne, "a", "b");
assert_eq!(code, "(a ~= b)");

// Conditional (uses Lua's and/or idiom)
let code = lua::emit_if("cond", "then_val", "else_val");
assert_eq!(code, "(cond and then_val or else_val)");

// Boolean logic
let code = lua::emit_not("flag");
assert_eq!(code, "(not flag)");

§Boolean Representation

Dew expressions use scalars for boolean values (0.0 = false, non-zero = true). The scalar_to_bool and bool_to_scalar functions handle conversions between the numeric representation and backend-native booleans.

use wick_cond::wgsl;

// Convert scalar to boolean for conditions
let bool_expr = wgsl::scalar_to_bool("x");
assert_eq!(bool_expr, "(x != 0.0)");

// Convert boolean back to scalar
let scalar_expr = wgsl::bool_to_scalar("flag");
assert_eq!(scalar_expr, "select(0.0, 1.0, flag)");

Enums§

CompareOp
Comparison operators (requires cond feature).