3 ms·
Replace my pointers with safe references then. Add a static assertion in a where clause about not being a ZST. The second example with the vtables is the point
by Ericson2314 3y ago
Replace my pointers with safe references then. Add a static assertion in a where clause about not being a ZST.
The second example with the vtables is the point (i.e. complicated data structures). qsort is just a simple example to introduce the concept.
- MaulingMonkey 3y agoVtables are pretty solved as well. I do a lot of Windows COM interop. Using the `windows` crate, vtables for COM interfaces are relegated to an implementation detail - instead you simply implement a (typically safe!) trait: https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/Media/Audio/XAudio2/trait.IXAudio2EngineCallback_Impl.html https://microsoft.github.io/windows-docs-rs/doc/windows/Win3... Which can then be converted to a refcounted smart pointer: https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/Media/Audio/XAudio2/struct.IXAudio2EngineCallback.html https://microsoft.github.io/windows-docs-rs/doc/windows/Win3... All driven by win32 sdk parsing and metadata. But suppose we want to roll our own, because we tend to prefer `winapi` but it lacks definition. That's not too terrible either: • https://github.com/MaulingMonkey/thindx-xaudio2/blob/master/crates/thindx-xaudio2-sys/src/sys28.rs#L919-L940 https://github.com/MaulingMonkey/thindx-xaudio2/blob/master/... • https://github.com/MaulingMonkey/thindx-xaudio2/blob/master/crates/thindx-xaudio2-sys/src/macros.rs https://github.com/MaulingMonkey/thindx-xaudio2/blob/master/... • https://github.com/MaulingMonkey/thindx-xaudio2/blob/master/crates/thindx-xaudio2/src/xa28/engine_callback.rs https://github.com/MaulingMonkey/thindx-xaudio2/blob/master/... I could more heavily lean on my macros ala `windows`, but I went the route of manual control for better doc comments, more explicit control of thread safety traits to match the existing C++ codebase, etc. Is there some pointer casting? Yes. Is it annoying or likely to be what breaks? No. What is annoying? • Stacked borrows and narrowing spatial provenance ( https://github.com/retep998/winapi-rs/issues/1025 https://github.com/retep998/winapi-rs/issues/1025 - this can be "solved" by sticking to pointers ala `windows`, or by choosing a different provenance model like rustc might be doing?) • Guarding against panics unwinding over an FFI boundary. This is at least being worked on, but remains unfinished ( https://rust-lang.github.io/rfcs/2945-c-unwind-abi.html https://rust-lang.github.io/rfcs/2945-c-unwind-abi.html ) • Edge case ABI weirdness specific to C++ methods ( https://devblogs.microsoft.com/oldnewthing/20220113-00/?p=106152 https://devblogs.microsoft.com/oldnewthing/20220113-00/?p=10... , https://github.com/retep998/winapi-rs/issues/523 https://github.com/retep998/winapi-rs/issues/523 )
- pjmlp 3y agoSide question, is writing COM stuff in Rust finally usable or is it still quite raw level programming, low level C style like before MFC and ATL came to be? Rust/WinRT has plenty of old open tickets into that regard, and given the team's track record on how they messed the developer experience with C++/WinRT and then gave up on it, I am not too keen investing into Rust/WinRT.
- Ericson2314 3y ago> Is there some pointer casting? Yes. Is it annoying [..]? No. Let's just agree to disagree on this.