luaur_common/functions/
join_impl.rs1use crate::macros::luau_assert::LUAU_ASSERT;
2use alloc::string::String;
3use alloc::vec::Vec;
4use core::ptr::copy_nonoverlapping;
5
6#[allow(non_snake_case)]
7pub(crate) fn joinImpl<S>(segments: &Vec<S>, delimiter: &str) -> String
8where
9 S: AsRef<[u8]>,
10{
11 if segments.is_empty() {
12 return String::new();
13 }
14
15 let mut len = (segments.len() - 1) * delimiter.len();
16 for sv in segments {
17 len += sv.as_ref().len();
18 }
19
20 let mut result = Vec::with_capacity(len);
21 unsafe {
22 result.set_len(len);
23 let mut dest = result.as_mut_ptr();
24
25 let mut it = segments.iter();
26 if let Some(first) = it.next() {
27 let first_bytes = first.as_ref();
28 copy_nonoverlapping(first_bytes.as_ptr(), dest, first_bytes.len());
29 dest = dest.add(first_bytes.len());
30
31 for segment in it {
32 copy_nonoverlapping(delimiter.as_ptr(), dest, delimiter.len());
33 dest = dest.add(delimiter.len());
34
35 let segment_bytes = segment.as_ref();
36 copy_nonoverlapping(segment_bytes.as_ptr(), dest, segment_bytes.len());
37 dest = dest.add(segment_bytes.len());
38 }
39 }
40
41 LUAU_ASSERT!(dest == result.as_mut_ptr().add(len));
42
43 String::from_utf8_unchecked(result)
44 }
45}