#iterator #macro #no-std

no-std cartesian

QOL macro that creates the cartesian product of multiple iterators

3 unstable releases

0.2.1 Mar 30, 2021
0.2.0 Mar 30, 2021
0.1.0 Mar 30, 2021

#2871 in Rust patterns

Download history 554/week @ 2024-01-04 702/week @ 2024-01-11 900/week @ 2024-01-18 1061/week @ 2024-01-25 968/week @ 2024-02-01 845/week @ 2024-02-08 557/week @ 2024-02-15 613/week @ 2024-02-22 470/week @ 2024-02-29 429/week @ 2024-03-07 426/week @ 2024-03-14 478/week @ 2024-03-21 315/week @ 2024-03-28 227/week @ 2024-04-04 159/week @ 2024-04-11 153/week @ 2024-04-18

925 downloads per month
Used in 2 crates (via rs2glsl-macros)

MIT license

6KB
71 lines

cartesian-rs

A macro for combining iterators to the cartesian product. Using the macro it is possible to write code compacter, and use less indention space.

Writing one for-loop and iterating through the cartesian product of multiple iterators is similar to nesting for loops, in each loop iterating through one of the iterators. However, the semantics of break is changed.

Example

let (m, n, p) = (3, 3, 1);

let mut id = vec![vec![0; n]; m];
for (i, j) in cartesian!(0..m, 0..n) {
    id[i][j] = (i == j) as u32;
}

let col_vec = vec![vec![1], vec![2], vec![4]];

let mut res = vec![vec![0; p]; m];

for (i, j, k) in cartesian!(0..m, 0..n, 0..p) {
    res[i][k] += id[i][j] * col_vec[j][k];
}

assert_eq!(col_vec, res);

License

This package is licensed under the MIT license.


lib.rs:

Provides a quality of life macro cartesian! to simplify certain loops.

The macro takes up to 26 iterators as arguments and creates the cartesian product iterator over all input iterators, kind of like nested for loops.

It behaves the same as nested for loops and brings the advantage of being more compact, and simplifies breaking and continuing.

Examples

use cartesian::*;

let mut volume_grid = vec![vec![vec![0; 10]; 10]; 10];
for (x, y, z) in cartesian!(0..10, 0..10, 0..10) {
    volume_grid[x][y][z] = x * y + z;
}
let (m, n, p) = (3, 3, 1);

let mut id = vec![vec![0; n]; m];
for (i, j) in cartesian!(0..m, 0..n) {
    id[i][j] = (i == j) as u32;
}

let col_vec = vec![vec![1], vec![2], vec![4]];

let mut res = vec![vec![0; p]; m];

for (i, j, k) in cartesian!(0..m, 0..n, 0..p) {
    res[i][k] += id[i][j] * col_vec[j][k];
}

assert_eq!(col_vec, res);

No runtime deps