Обробка помилок CXX: Приклад з QR

Генератор QR-кодів - це приклад, де булеве значення використовується для передачі інформації про успіх чи невдачу, і де успішний результат може бути переданий через межу FFI:

#[cxx::bridge(namespace = "qr_code_generator")]
mod ffi {
    extern "Rust" {
        fn generate_qr_code_using_rust(
            data: &[u8],
            min_version: i16,
            out_pixels: Pin<&mut CxxVector<u8>>,
            out_qr_size: &mut usize,
        ) -> bool;
    }
}

Студентам може бути цікаво дізнатися про семантику виведення out_qr_size. Це не розмір вектора, а розмір QR-коду (і слід визнати, що це трохи зайве - це квадратний корінь з розміру вектора).

Варто звернути увагу на важливість ініціалізації out_qr_size перед викликом функції Rust. Створення посилання у Rust, яке вказує на неініціалізовану пам'ять, призводить до Undefined Behavior (на відміну від C++, де лише акт розіменування такої пам'яті призводить до UB).

Якщо студенти запитають про Pin, поясніть, навіщо він потрібен CXX для змінних посилань на дані C++: відповідь полягає в тому, що дані C++ не можна переміщати, як дані Rust, оскільки вони можуть містити самопосилальні вказівники.