const_str/__ctfe/
to_char_array.rs1pub struct ToCharArray<T>(pub T);
2
3impl ToCharArray<&str> {
4 pub const fn output_len(&self) -> usize {
5 crate::utf8::str_count_chars(self.0)
6 }
7
8 pub const fn const_eval<const N: usize>(&self) -> [char; N] {
9 crate::utf8::str_chars(self.0)
10 }
11}
12
13#[macro_export]
24macro_rules! to_char_array {
25 ($s: expr) => {{
26 const OUTPUT_LEN: usize = $crate::__ctfe::ToCharArray($s).output_len();
27 const OUTPUT_BUF: [char; OUTPUT_LEN] =
28 $crate::__ctfe::ToCharArray($s).const_eval::<OUTPUT_LEN>();
29 OUTPUT_BUF
30 }};
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36
37 #[test]
38 fn test_to_char_array() {
39 const CHARS: [char; 5] = to_char_array!("Hello");
40 assert_eq!(CHARS, ['H', 'e', 'l', 'l', 'o']);
41
42 const EMPTY: [char; 0] = to_char_array!("");
43 assert_eq!(EMPTY, []);
44
45 const UNICODE: [char; 3] = to_char_array!("你好!");
46 assert_eq!(UNICODE, ['你', '好', '!']);
47
48 const SINGLE: [char; 1] = to_char_array!("A");
49 assert_eq!(SINGLE, ['A']);
50 }
51
52 #[test]
53 fn test_to_char_array_runtime() {
54 let to_arr = ToCharArray("test");
56 assert_eq!(to_arr.output_len(), 4);
57 let result: [char; 4] = to_arr.const_eval();
58 assert_eq!(result, ['t', 'e', 's', 't']);
59
60 let to_arr_unicode = ToCharArray("你好");
61 assert_eq!(to_arr_unicode.output_len(), 2);
62 let result2: [char; 2] = to_arr_unicode.const_eval();
63 assert_eq!(result2, ['你', '好']);
64
65 let to_arr_empty = ToCharArray("");
66 assert_eq!(to_arr_empty.output_len(), 0);
67 let result3: [char; 0] = to_arr_empty.const_eval();
68 assert_eq!(result3, []);
69
70 let to_arr_emoji = ToCharArray("🎉");
71 assert_eq!(to_arr_emoji.output_len(), 1);
72 let result4: [char; 1] = to_arr_emoji.const_eval();
73 assert_eq!(result4, ['🎉']);
74 }
75}