partial_const/
lib.rs

1//! This library provides a way to handle constant and non-constant values in a unified way.
2//! This library takes both flexibilities to take dynamic values and (partial) parameter checking by the compiler.
3//!
4//! # Example
5//! ```
6//! # #[cfg(feature = "i32")] #[rustversion::since(1.51)] fn test() {
7//! fn maybe_one<T: partial_const::MayBeConst<i32>>(i: T) -> bool
8//!     where T: partial_const::Equals<partial_const::ConstI32<1>> {
9//! //  where T: partial_const::Equals<partial_const::i32::Const<1>> { <- Alternative
10//!     i.value() == 1i32
11//! }
12//!
13//! assert!(maybe_one(partial_const::ConstI32::<1>::new()));
14//! assert!(maybe_one::<partial_const::ConstI32<1>>(partial_const::ConstI32::new()));
15//! assert!(maybe_one::<i32>(1));
16//! assert!(!maybe_one::<i32>(2));
17//! // assert!(maybe_one(partial_const::ConstI32::<2>::new())); <- Compile Error
18//! # }
19//! # #[cfg(not(feature = "i32"))] fn test(){}
20//! # #[cfg(feature = "i32")] #[rustversion::not(since(1.51))] fn test(){}
21//! # test();
22//! ```
23#![cfg_attr(feature = "incomplete", allow(incomplete_features))]
24#![cfg_attr(feature = "incomplete", feature(const_generics))]
25#![cfg_attr(feature = "incomplete", feature(const_evaluatable_checked))]
26#![cfg_attr(feature = "incomplete", feature(const_panic))]
27
28#[cfg(feature = "bool")]
29/// module for [prim@bool]
30pub mod bool;
31
32#[cfg(feature = "bool")]
33#[rustversion::since(1.51)]
34/// See [struct@bool::Const]
35pub type ConstBool<const VALUE: bool> = crate::bool::Const<VALUE>;
36
37include!("stable.rs");
38#[rustversion::since(1.51)]
39include!("min.rs");
40#[rustversion::all(since(1.51), nightly)]
41#[cfg(feature = "incomplete")]
42include!("incomplete.rs");
43
44macro_rules! expand_impl {
45    ($c:tt, $t:tt, $($doc1:expr),*;$($doc2:expr),*;$($doc3:expr),*) => {
46        $(#[doc=$doc1])*
47        pub mod $t {
48            impl_stable!($t);
49            #[rustversion::since(1.51)]
50            impl_min!($t, $($doc3),*);
51            #[rustversion::all(since(1.51), nightly)]
52            #[cfg(feature = "incomplete")]
53            impl_incomplete!($t);
54        }
55        #[rustversion::since(1.51)]
56        impl_min_out!($c, $t, $($doc2),*);
57    };
58}
59#[cfg(feature = "usize")]
60expand_impl!(ConstUsize, usize, "module for [prim@usize]"; "See [struct@usize::Const]";
61    "Constant [prim@usize] value",
62    "",
63    "# Example",
64    "```",
65    "# use partial_const::*;",
66    "let const_value = partial_const::usize::Const::<42>::new();",
67    "assert_eq!(core::mem::size_of::<partial_const::usize::Const<42>>(), 0);",
68    "assert_eq!(const_value.value(), 42);",
69    "```");
70#[cfg(feature = "isize")]
71expand_impl!(ConstIsize, isize, "module for [prim@isize]"; "See [struct@isize::Const]";
72    "Constant [prim@isize] value",
73    "",
74    "# Example",
75    "```",
76    "# use partial_const::*;",
77    "let const_value = partial_const::isize::Const::<42>::new();",
78    "assert_eq!(core::mem::size_of::<partial_const::isize::Const<42>>(), 0);",
79    "assert_eq!(const_value.value(), 42);",
80    "```");
81#[cfg(feature = "i8")]
82expand_impl!(ConstI8, i8, "module for [prim@i8]"; "See [struct@i8::Const]";
83    "Constant [prim@i8] value",
84    "",
85    "# Example",
86    "```",
87    "# use partial_const::*;",
88    "let const_value = partial_const::i8::Const::<42>::new();",
89    "assert_eq!(core::mem::size_of::<partial_const::i8::Const<42>>(), 0);",
90    "assert_eq!(const_value.value(), 42);",
91    "```");
92#[cfg(feature = "i16")]
93expand_impl!(ConstI16, i16, "module for [prim@i16]"; "See [struct@i16::Const]";
94    "Constant [prim@i16] value",
95    "",
96    "# Example",
97    "```",
98    "# use partial_const::*;",
99    "let const_value = partial_const::i16::Const::<42>::new();",
100    "assert_eq!(core::mem::size_of::<partial_const::i16::Const<42>>(), 0);",
101    "assert_eq!(const_value.value(), 42);",
102    "```");
103#[cfg(feature = "i32")]
104expand_impl!(ConstI32, i32, "module for [prim@i32]"; "See [struct@i32::Const]";
105    "Constant [prim@i32] value",
106    "",
107    "# Example",
108    "```",
109    "# use partial_const::*;",
110    "let const_value = partial_const::i32::Const::<42>::new();",
111    "assert_eq!(core::mem::size_of::<partial_const::i32::Const<42>>(), 0);",
112    "assert_eq!(const_value.value(), 42);",
113    "```");
114#[cfg(feature = "i64")]
115expand_impl!(ConstI64, i64, "module for [prim@i64]"; "See [struct@i64::Const]";
116    "Constant [prim@i64] value",
117    "",
118    "# Example",
119    "```",
120    "# use partial_const::*;",
121    "let const_value = partial_const::i64::Const::<42>::new();",
122    "assert_eq!(core::mem::size_of::<partial_const::i64::Const<42>>(), 0);",
123    "assert_eq!(const_value.value(), 42);",
124    "```");
125#[cfg(feature = "i128")]
126expand_impl!(ConstI128, i128, "module for [prim@i128]"; "See [struct@i128::Const]";
127    "Constant [prim@i128] value",
128    "",
129    "# Example",
130    "```",
131    "# use partial_const::*;",
132    "let const_value = partial_const::i128::Const::<42>::new();",
133    "assert_eq!(core::mem::size_of::<partial_const::i128::Const<42>>(), 0);",
134    "assert_eq!(const_value.value(), 42);",
135    "```");
136#[cfg(feature = "u8")]
137expand_impl!(ConstU8, u8, "module for [prim@u8]"; "See [struct@u8::Const]";
138    "Constant [prim@u8] value",
139    "",
140    "# Example",
141    "```",
142    "# use partial_const::*;",
143    "let const_value = partial_const::u8::Const::<42>::new();",
144    "assert_eq!(core::mem::size_of::<partial_const::u8::Const<42>>(), 0);",
145    "assert_eq!(const_value.value(), 42);",
146    "```");
147#[cfg(feature = "u16")]
148expand_impl!(ConstU16, u16, "module for [prim@u16]"; "See [struct@u16::Const]";
149    "Constant [prim@u16] value",
150    "",
151    "# Example",
152    "```",
153    "# use partial_const::*;",
154    "let const_value = partial_const::u16::Const::<42>::new();",
155    "assert_eq!(core::mem::size_of::<partial_const::u16::Const<42>>(), 0);",
156    "assert_eq!(const_value.value(), 42);",
157    "```");
158#[cfg(feature = "u32")]
159expand_impl!(ConstU32, u32, "module for [prim@u32]"; "See [struct@u32::Const]";
160    "Constant [prim@u32] value",
161    "",
162    "# Example",
163    "```",
164    "# use partial_const::*;",
165    "let const_value = partial_const::u32::Const::<42>::new();",
166    "assert_eq!(core::mem::size_of::<partial_const::u32::Const<42>>(), 0);",
167    "assert_eq!(const_value.value(), 42);",
168    "```");
169#[cfg(feature = "u64")]
170expand_impl!(ConstU64, u64, "module for [prim@u64]"; "See [struct@u64::Const]";
171    "Constant [prim@u64] value",
172    "",
173    "# Example",
174    "```",
175    "# use partial_const::*;",
176    "let const_value = partial_const::u64::Const::<42>::new();",
177    "assert_eq!(core::mem::size_of::<partial_const::u64::Const<42>>(), 0);",
178    "assert_eq!(const_value.value(), 42);",
179    "```");
180#[cfg(feature = "u128")]
181expand_impl!(ConstU128, u128, "module for [prim@u128]"; "See [struct@u128::Const]";
182    "Constant [prim@u128] value",
183    "",
184    "# Example",
185    "```",
186    "# use partial_const::*;",
187    "let const_value = partial_const::u128::Const::<42>::new();",
188    "assert_eq!(core::mem::size_of::<partial_const::u128::Const<42>>(), 0);",
189    "assert_eq!(const_value.value(), 42);",
190    "```");
191#[cfg(feature = "char")]
192expand_impl!(ConstChar, char, "module for [prim@char]"; "See [struct@char::Const]";
193    "Constant [prim@char] value",
194    "",
195    "# Example",
196    "```",
197    "# use partial_const::*;",
198    "let const_value = partial_const::char::Const::<'A'>::new();",
199    "assert_eq!(core::mem::size_of::<partial_const::char::Const<'A'>>(), 0);",
200    "assert_eq!(const_value.value(), 'A');",
201    "```");