Manejo de Errores en CXX: Ejemplo de QR

El generador de código QR es un ejemplo en el que el valor booleano se utiliza para comunicar que el resultado es correcto o no, y dónde se puede transmitir el resultado correcto a través del límite de 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;
    }
}

Puede que los participantes sientan curiosidad acerca de la semántica del resultado de salida out_qr_size. No se trata del tamaño del vector, sino del tamaño del código QR (y admitimos que es un poco redundante, ya que se trata de la raíz cuadrada del tamaño del vector).

Cabe destacar la importancia de inicializar out_qr_size antes de llamar a la función de Rust. La creación de una referencia de Rust que apunte a una memoria no inicializada tiene como resultado un comportamiento indefinido (a diferencia de C++, cuando solo el acto de desreferenciar la memoria resulta en comportamiento indefinido).

Si los participantes preguntan por Pin, explica por qué CXX lo necesita para referencias mutables a datos de C++. Los datos de C++ no se pueden mover como los datos de Rust, ya que pueden contener punteros de autorreferencia.