cxx: expose c++ code
This commit is contained in:
parent
efa1543eaf
commit
a17f8e2f73
1
Cargo.lock
generated
1
Cargo.lock
generated
|
|
@ -251,6 +251,7 @@ name = "tictactoe-rust-foropenspiel"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cxx",
|
"cxx",
|
||||||
|
"cxx-build",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,6 @@ edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cxx = "1.0.192"
|
cxx = "1.0.192"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cxx-build = "1.0.192"
|
||||||
|
|
|
||||||
9
build.rs
Normal file
9
build.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
fn main() {
|
||||||
|
cxx_build::bridge("src/game.rs")
|
||||||
|
.file("src/main.cc")
|
||||||
|
.compile("tictactoe-rust-foropenspiel");
|
||||||
|
|
||||||
|
println!("cargo:rerun-if-changed=src/game.rs");
|
||||||
|
println!("cargo:rerun-if-changed=src/game.cc");
|
||||||
|
println!("cargo:rerun-if-changed=include/game.h");
|
||||||
|
}
|
||||||
3
include/main.h
Normal file
3
include/main.h
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
void run_cpp_demo();
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use std::{fmt, str};
|
use std::{fmt, str};
|
||||||
|
|
||||||
#[cxx::bridge]
|
#[cxx::bridge]
|
||||||
mod ffi {
|
pub mod ffi {
|
||||||
// Rust types and signatures exposed to C++.
|
// Rust types and signatures exposed to C++.
|
||||||
extern "Rust" {
|
extern "Rust" {
|
||||||
type Player;
|
type Player;
|
||||||
|
|
@ -15,6 +15,8 @@ mod ffi {
|
||||||
|
|
||||||
// C++ types and signatures exposed to Rust.
|
// C++ types and signatures exposed to Rust.
|
||||||
unsafe extern "C++" {
|
unsafe extern "C++" {
|
||||||
|
include!("tictactoe-rust-foropenspiel/include/main.h");
|
||||||
|
fn run_cpp_demo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
21
src/main.cc
Normal file
21
src/main.cc
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "tictactoe-rust-foropenspiel/include/main.h"
|
||||||
|
#include "tictactoe-rust-foropenspiel/src/game.rs.h"
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
void run_cpp_demo() {
|
||||||
|
rust::Box<GameState> game = init();
|
||||||
|
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937 gen(rd());
|
||||||
|
|
||||||
|
rust::Vec<size_t> actions = game->legal_actions();
|
||||||
|
while (!actions.empty()) {
|
||||||
|
std::uniform_int_distribution<size_t> dis(0, actions.size() - 1);
|
||||||
|
game->do_action(actions[dis(gen)]);
|
||||||
|
actions = game->legal_actions();
|
||||||
|
}
|
||||||
|
std::cout << "Result: \n" << game->to_string().c_str();
|
||||||
|
}
|
||||||
14
src/main.rs
14
src/main.rs
|
|
@ -1,13 +1,7 @@
|
||||||
mod game;
|
mod game;
|
||||||
|
|
||||||
use game::GameState;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut game = GameState::default();
|
println!("--- Calling C++ from Rust ---");
|
||||||
let mut actions = game.legal_actions();
|
game::ffi::run_cpp_demo();
|
||||||
while !actions.is_empty() {
|
println!("--- Back in Rust ---");
|
||||||
game.do_action(actions[0]);
|
}
|
||||||
actions = game.legal_actions();
|
|
||||||
}
|
|
||||||
println!("Result: \n{game}");
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue