diff options
Diffstat (limited to 'vendor/crunchy/src/lib.rs')
-rw-r--r-- | vendor/crunchy/src/lib.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/vendor/crunchy/src/lib.rs b/vendor/crunchy/src/lib.rs new file mode 100644 index 0000000..6de39e2 --- /dev/null +++ b/vendor/crunchy/src/lib.rs @@ -0,0 +1,36 @@ +//! The crunchy unroller - deterministically unroll constant loops. For number "crunching". +//! +//! The Rust optimizer will unroll constant loops that don't use the loop variable, like this: +//! +//! ```ignore +//! for _ in 0..100 { +//! println!("Hello!"); +//! } +//! ``` +//! +//! However, using the loop variable will cause it to never unroll the loop. This is unfortunate because it means that you can't +//! constant-fold the loop variable, and if you end up stomping on the registers it will have to do a load for each iteration. +//! This crate ensures that your code is unrolled and const-folded. It only works on literals, +//! unfortunately, but there's a work-around: +//! +//! ```ignore +//! debug_assert_eq!(MY_CONSTANT, 100); +//! unroll! { +//! for i in 0..100 { +//! println!("Iteration {}", i); +//! } +//! } +//! ``` +//! This means that your tests will catch if you redefine the constant. +//! +//! To default maximum number of loops to unroll is `64`, but that can be easily increased using the cargo features: +//! +//! * `limit_128` +//! * `limit_256` +//! * `limit_512` +//! * `limit_1024` +//! * `limit_2048` + +#![cfg_attr(not(feature = "std"), no_std)] + +include!(concat!(env!("OUT_DIR"), "/lib.rs")); |