Skip to main content

luaur_common/functions/
join_impl.rs

1use 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}