#iterator #macro #no-std

no-std cartesian

创建多个迭代器笛卡尔积的QOL宏

3个不稳定版本

0.2.1 2021年3月30日
0.2.0 2021年3月30日
0.1.0 2021年3月30日

#2968 in Rust patterns

Download history 379/week @ 2024-03-13 515/week @ 2024-03-20 312/week @ 2024-03-27 285/week @ 2024-04-03 142/week @ 2024-04-10 168/week @ 2024-04-17 141/week @ 2024-04-24 145/week @ 2024-05-01 144/week @ 2024-05-08 116/week @ 2024-05-15 106/week @ 2024-05-22 120/week @ 2024-05-29 150/week @ 2024-06-05 152/week @ 2024-06-12 110/week @ 2024-06-19 108/week @ 2024-06-26

每月542次下载
2个crate中使用了(通过rs2glsl-macros

MIT许可协议

6KB
71

cartesian-rs

一个宏,用于将迭代器组合到笛卡尔积中。使用该宏可以编写更紧凑的代码,并减少缩进空间。

编写一个循环并迭代多个迭代器的笛卡尔积类似于嵌套循环,每个循环迭代一个迭代器。然而,break的语义已更改。

示例

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);

许可协议

本软件包根据MIT许可协议授权。


lib.rs:

提供了一个简化某些循环的质量宏cartesian!

该宏接受最多26个迭代器作为参数,并创建所有输入迭代器的笛卡尔积迭代器,类似于嵌套的for循环。

其行为与嵌套的for循环相同,具有更紧凑和简化break和continue的优势。

示例

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);

无运行时依赖