#[macro_export]
macro_rules! const_frozen_string {
($s:expr) => {{
$crate::values::constant_string($s).unwrap_or_else(|| {
const UNREACHABLE: bool = $s.len() <= 1;
const N: usize = if UNREACHABLE {
1
} else {
$crate::values::string::StarlarkStr::payload_len_for_len($s.len())
};
static X: $crate::values::StarlarkStrNRepr<N> =
$crate::values::StarlarkStrNRepr::new(if UNREACHABLE { "xx" } else { $s });
if UNREACHABLE {
unreachable!()
} else {
X.erase()
}
})
}};
}
#[cfg(test)]
mod tests {
use crate::values::FrozenHeap;
use crate::values::Heap;
#[test]
fn test_const_frozen_string_for_short_strings() {
assert!(
const_frozen_string!("a")
.to_value()
.ptr_eq(const_frozen_string!("a").to_value())
);
let heap = Heap::new();
assert!(
const_frozen_string!("a")
.to_value()
.ptr_eq(heap.alloc_str("a").to_value())
);
let frozen_heap = FrozenHeap::new();
assert!(
const_frozen_string!("a")
.to_value()
.ptr_eq(frozen_heap.alloc_str("a").to_value())
);
}
#[test]
fn test_const_frozen_string() {
assert_eq!("", const_frozen_string!("").as_str());
assert_eq!("a", const_frozen_string!("a").as_str());
assert_eq!("ab", const_frozen_string!("ab").as_str());
assert_eq!("abc", const_frozen_string!("abc").as_str());
assert_eq!("abcd", const_frozen_string!("abcd").as_str());
assert_eq!("abcde", const_frozen_string!("abcde").as_str());
assert_eq!("abcdef", const_frozen_string!("abcdef").as_str());
assert_eq!("abcdefg", const_frozen_string!("abcdefg").as_str());
assert_eq!("abcdefgh", const_frozen_string!("abcdefgh").as_str());
assert_eq!("abcdefghi", const_frozen_string!("abcdefghi").as_str());
assert_eq!("abcdefghij", const_frozen_string!("abcdefghij").as_str());
assert_eq!("abcdefghijk", const_frozen_string!("abcdefghijk").as_str());
}
}