Skip to main content

libutils_constrangeiter/
mod.rs

1//^
2//^ HEAD
3//^
4
5//> HEAD -> NO_STD
6#![no_std]
7
8//> HEAD -> FEATURES
9#![feature(const_trait_impl)]
10#![feature(const_iter)]
11#![feature(const_ops)]
12#![feature(const_closures)]
13#![feature(const_option_ops)]
14#![feature(const_convert)]
15#![feature(const_try)]
16#![feature(const_cmp)]
17#![feature(trusted_len)]
18#![feature(test)]
19#![feature(const_destruct)]
20#![feature(new_range)]
21
22//> HEAD -> CRATES
23extern crate alloc;
24extern crate test;
25
26//> HEAD -> MODULES
27mod range;
28mod rangefrom;
29mod rangeinclusive;
30#[cfg(test)]
31mod tests;
32
33//> HEAD -> CORE
34use core::{
35    ops::{
36        AddAssign, 
37        SubAssign,
38        Sub
39    }, 
40    marker::Destruct
41};
42
43
44//^
45//^ TRAIT
46//^
47
48//> TRAIT -> DEFINITION
49pub const trait ConstIntoIterator {
50    type Item;
51    type IntoIter: const Iterator<Item = Self::Item>;
52    fn const_into_iter(self) -> Self::IntoIter;
53}
54
55
56//^
57//^ TARGET
58//^
59
60//> TARGET -> TRAIT
61pub const trait Target: Copy + const AddAssign + const SubAssign + const PartialOrd + const Sub<Output = Self> + const Destruct
62where usize: const TryFrom<Self>, <usize as TryFrom<Self>>::Error: const Destruct {
63    const ONE: Self;
64    const MAX: Self;
65    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
66        Ok(number) => (number, Some(number)),
67        Err(_) => (usize::MAX, None)
68    }}
69}
70
71//> TARGET -> U8
72const impl Target for u8 {
73    const ONE: Self = 1u8;
74    const MAX: Self = u8::MAX;
75    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
76        Ok(number) => (number, Some(number)),
77        Err(_) => (usize::MAX, None)
78    }}
79}
80
81//> TARGET -> I8
82const impl Target for i8 {
83    const ONE: Self = 1i8;
84    const MAX: Self = i8::MAX;
85    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
86        Ok(number) => (number, Some(number)),
87        Err(_) => (usize::MAX, None)
88    }}
89}
90
91//> TARGET -> U16
92const impl Target for u16 {
93    const ONE: Self = 1u16;
94    const MAX: Self = u16::MAX;
95    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
96        Ok(number) => (number, Some(number)),
97        Err(_) => (usize::MAX, None)
98    }}
99}
100
101//> TARGET -> I16
102const impl Target for i16 {
103    const ONE: Self = 1i16;
104    const MAX: Self = i16::MAX;
105    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
106        Ok(number) => (number, Some(number)),
107        Err(_) => (usize::MAX, None)
108    }}
109}
110
111//> TARGET -> U32
112const impl Target for u32 {
113    const ONE: Self = 1u32;
114    const MAX: Self = u32::MAX;
115    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
116        Ok(number) => (number, Some(number)),
117        Err(_) => (usize::MAX, None)
118    }}
119}
120
121//> TARGET -> I32
122const impl Target for i32 {
123    const ONE: Self = 1i32;
124    const MAX: Self = i32::MAX;
125    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
126        Ok(number) => (number, Some(number)),
127        Err(_) => (usize::MAX, None)
128    }}
129}
130
131//> TARGET -> U64
132const impl Target for u64 {
133    const ONE: Self = 1u64;
134    const MAX: Self = u64::MAX;
135    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
136        Ok(number) => (number, Some(number)),
137        Err(_) => (usize::MAX, None)
138    }}
139}
140
141//> TARGET -> I64
142const impl Target for i64 {
143    const ONE: Self = 1i64;
144    const MAX: Self = i64::MAX;
145    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
146        Ok(number) => (number, Some(number)),
147        Err(_) => (usize::MAX, None)
148    }}
149}
150
151//> TARGET -> U128
152const impl Target for u128 {
153    const ONE: Self = 1u128;
154    const MAX: Self = u128::MAX;
155    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
156        Ok(number) => (number, Some(number)),
157        Err(_) => (usize::MAX, None)
158    }}
159}
160
161//> TARGET -> I128
162const impl Target for i128 {
163    const ONE: Self = 1i128;
164    const MAX: Self = i128::MAX;
165    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
166        Ok(number) => (number, Some(number)),
167        Err(_) => (usize::MAX, None)
168    }}
169}
170
171//> TARGET -> USIZE
172const impl Target for usize {
173    const ONE: Self = 1usize;
174    const MAX: Self = usize::MAX;
175    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
176        Ok(number) => (number, Some(number)),
177        Err(_) => (usize::MAX, None)
178    }}
179}
180
181//> TARGET -> ISIZE
182const impl Target for isize {
183    const ONE: Self = 1isize;
184    const MAX: Self = isize::MAX;
185    fn hint(self, start: Self) -> (usize, Option<usize>) {match usize::try_from(self - start) {
186        Ok(number) => (number, Some(number)),
187        Err(_) => (usize::MAX, None)
188    }}
189}