use crate::windows;
use windows::core::HSTRING;
pub trait HStringExt {
fn as_safely_truncated_wide(&self, target_len: usize) -> &[u16];
fn write_truncated(&self, buf: &mut [u16]);
}
impl HStringExt for HSTRING {
fn as_safely_truncated_wide(&self, target_len: usize) -> &[u16] {
let slice = self.as_wide();
let len = slice.len();
if target_len >= len {
return slice;
}
if len
.checked_sub(1)
.map(|last_index| is_leading_surrogate(slice[last_index]))
.unwrap_or(false )
{
&slice[..len - 1]
} else {
&slice[..len]
}
}
fn write_truncated(&self, buf: &mut [u16]) {
let truncated_slice =
self.as_safely_truncated_wide(self.len().min(buf.len() - 1 ));
buf[..truncated_slice.len()].copy_from_slice(truncated_slice);
buf[truncated_slice.len()] = 0;
}
}
const fn is_leading_surrogate(wide_char: u16) -> bool {
wide_char >= 0xd800 && wide_char <= 0xdbff
}