Я пытаюсь написать привязки Rust для библиотеки коллекции C (Judy Arrays [1]), которая предоставляет только место для хранения значения ширины указателя. У моей компании есть довольно много существующего кода, который использует это пространство для непосредственного хранения значений не указателя, таких как целые числа указателей и небольшие структуры. Я хотел бы, чтобы мои привязки Rust позволяли безопасный доступ к таким коллекциям с использованием типов, но у меня возникли проблемы с правильной обработкой семантики указателя.
У меня есть базовый интерфейс, использующий std::mem::transmute_copy()
для хранения значения, но эта функция явно не делает ничего, чтобы гарантировать, что исходные и целевые типы имеют одинаковый размер. Я могу проверить, что параметр типа сбора имеет совместимый размер во время выполнения через утверждение, но мне бы очень хотелось, чтобы чек был каким-то образом во время компиляции.
Пример кода:
pub struct Example<T> {
v: usize,
t: PhantomData<T>,
}
impl<T> Example<T> {
pub fn new() -> Example<T> {
assert!(mem::size_of::<usize>() == mem::size_of::<T>());
Example { v: 0, t: PhantomData }
}
pub fn insert(&mut self, val: T) {
unsafe {
self.v = mem::transmute_copy(&val);
mem::forget(val);
}
}
}
Есть ли лучший способ сделать это, или это проверка времени выполнения, которую поддерживает лучший Rust 1.0?
(Связанный вопрос, объясняя, почему я не использую mem::transmute()
.)
[1] Я знаю о существующем проекте ржавчины-юниора, но он не поддерживает захват указателя, которого я хочу, и я пишу эти новые привязки в основном как учебное упражнение в любом случае.