const_str/__ctfe/
repeat.rs1#![allow(unsafe_code)]
2
3use super::StrBuf;
4
5pub struct Repeat<T>(pub T, pub usize);
6
7impl Repeat<&str> {
8 pub const fn const_eval<const N: usize>(&self) -> StrBuf<N> {
9 let buf = bytes_repeat(self.0.as_bytes(), self.1);
10 unsafe { StrBuf::new_unchecked(buf) }
11 }
12}
13
14const fn bytes_repeat<const N: usize>(bytes: &[u8], n: usize) -> [u8; N] {
15 assert!(bytes.len().checked_mul(n).is_some());
16 assert!(bytes.len() * n == N);
17 let mut buf = [0; N];
18 let mut i = 0;
19 let mut j = 0;
20 while i < n {
21 let mut k = 0;
22 while k < bytes.len() {
23 buf[j] = bytes[k];
24 j += 1;
25 k += 1;
26 }
27 i += 1;
28 }
29 buf
30}
31
32#[macro_export]
45macro_rules! repeat {
46 ($s: expr, $n: expr) => {{
47 const INPUT: &str = $s;
48 const N: usize = $n;
49 const OUTPUT_LEN: usize = INPUT.len() * N;
50 const OUTPUT_BUF: $crate::__ctfe::StrBuf<OUTPUT_LEN> =
51 $crate::__ctfe::Repeat(INPUT, N).const_eval();
52 OUTPUT_BUF.as_str()
53 }};
54}