From 1b6a04ca5504955c571d1c97504fb45ea0befee4 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Mon, 8 Jan 2024 01:21:28 +0400 Subject: Initial vendor packages Signed-off-by: Valentin Popov --- vendor/crunchy/src/lib.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 vendor/crunchy/src/lib.rs (limited to 'vendor/crunchy/src/lib.rs') 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")); -- cgit v1.2.3