Skip to content

Instantly share code, notes, and snippets.

View sakex's full-sized avatar
🇮🇱

Alexandre Senges sakex

🇮🇱
View GitHub Profile
#!/bin/bash
echo hello world
// bindings.hpp
extern "C" void register_button(GUI::Engine *engine, AbstractButtonBinding *button) {
auto *concrete = new ButtonBindingConcrete(button);
engine->registerButton(concrete);
};
// build.rs
extern crate cc;
fn main() {
cc::Build::new()
.cpp(true)
.include("cpp")
.file("cpp/Engine.cpp")
.file("cpp/bindings.cpp")
// bindings.hpp
extern "C" {
struct AbstractButtonBinding {
void (*click)(void *cont);
char const *(*inner_text)(void *cont);
void *context;
};
// bindings.hpp
class ButtonBindingConcrete : public AbstractButton {
public:
explicit ButtonBindingConcrete(AbstractButtonBinding *_binding): binding{_binding} {
}
// RAII free the pointer on delete
~ButtonBindingConcrete() {
delete binding;
}
void click() override {
// src/engine.rs
use std::ffi::c_void;
use crate::bindings::engine_factory;
pub struct Engine {
ptr: *mut c_void
}
impl Engine {
pub fn new() -> Engine {
// src/button.rs
pub trait Button {
fn click(&mut self);
fn inner_text(&mut self) -> String;
}
// src/bindings.rs
use crate::Button;
use std::os::raw::c_char;
#[repr(C)]
pub struct AbstractButtonBinding<T>
where T: Button{
pub click: unsafe extern fn(*mut T),
pub inner_text: unsafe extern fn(*mut T) -> *const c_char,
// src/bindings.rs
use std::ffi::c_void;
#[link(name = "gui", kind = "static")]
extern "C" {
/// Return a void pointer from the heap, the alternative would have been to write recursively
/// all the fields in a #[repr(C)] struct Engine ...
pub fn engine_factory() -> *mut c_void;
}
// bindings.hpp
extern "C" {
GUI::Engine *engine_factory() {
return new GUI::Engine();
}
}