mirror of https://github.com/dnomd343/klotski.git
Dnomd343
1 month ago
8 changed files with 89 additions and 33 deletions
@ -0,0 +1,15 @@ |
|||||
|
#include "rust_ffi/include/common_code.h" |
||||
|
|
||||
|
#include <common_code/common_code.h> |
||||
|
|
||||
|
using klotski::ffi::RsCommonCode; |
||||
|
|
||||
|
rust::String RsCommonCode::to_string() const noexcept { |
||||
|
return codec::CommonCode::unsafe_create(code).to_string(); |
||||
|
} |
||||
|
|
||||
|
// TODO: it seems that cxx.rs not support `std::optional`
|
||||
|
RsCommonCode klotski::ffi::from_string(rust::Str s) { |
||||
|
std::string_view sv {s.data(), s.length()}; |
||||
|
return {codec::CommonCode::from_string(sv)->unwrap()}; // TODO: value check
|
||||
|
} |
@ -1,8 +1,33 @@ |
|||||
|
use cxx_build::CFG; |
||||
|
|
||||
|
// NOTE: add `CC=clang-20 CXX=clang++-20 CXXFLAGS="-stdlib=libc++"` for cargo command
|
||||
|
// we should keep cxx crate using clang for `cxx.cc`
|
||||
|
|
||||
|
// NOTE: also, `RUSTFLAGS="-C linker=clang-20"` should be add to cargo env for using lld
|
||||
|
|
||||
fn main() { |
fn main() { |
||||
|
CFG.include_prefix = "rust_ffi"; |
||||
|
|
||||
|
// std::env::set_var("CC", "clang-20");
|
||||
|
// std::env::set_var("CXX", "clang++-20");
|
||||
|
|
||||
cxx_build::bridge("src/common_code.rs") |
cxx_build::bridge("src/common_code.rs") |
||||
.file("src/demo.cc") |
.file("adapter/common_code.cc") |
||||
|
.flag("-std=c++23") |
||||
|
.flag("-fno-rtti") |
||||
|
.flag("-fno-exceptions") |
||||
|
// .flag("-stdlib=libc++")
|
||||
|
.include("../../core") |
||||
|
// .cpp_set_stdlib("c++")
|
||||
|
// .cpp_link_stdlib("c++")
|
||||
.compile("klotski"); |
.compile("klotski"); |
||||
|
|
||||
println!("cargo:rerun-if-changed=src/demo.cc"); |
println!("cargo:rustc-link-search=native=../../../cmake-build-release/src/core"); |
||||
|
println!("cargo:rustc-link-lib=static=klotski_core"); |
||||
|
|
||||
|
println!("cargo:rustc-link-arg=-fuse-ld=lld-20"); |
||||
|
println!("cargo:rustc-link-arg=-stdlib=libc++"); |
||||
|
|
||||
|
println!("cargo:rerun-if-changed=adapter/common_code.cc"); |
||||
println!("cargo:rerun-if-changed=src/common_code.rs"); |
println!("cargo:rerun-if-changed=src/common_code.rs"); |
||||
} |
} |
||||
|
@ -0,0 +1,9 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "rust_ffi/src/common_code.rs.h" |
||||
|
|
||||
|
namespace klotski::ffi { |
||||
|
|
||||
|
RsCommonCode from_string(rust::Str s); |
||||
|
|
||||
|
} // namespace klotski::ffi
|
@ -1,18 +1,37 @@ |
|||||
#[cxx::bridge] |
#[cxx::bridge(namespace = "klotski::ffi")] |
||||
pub mod ffi { |
mod ffi { |
||||
#[derive(Debug)] |
#[derive(Debug)] |
||||
pub struct CommonCode { |
struct RsCommonCode { |
||||
code: u64 |
code: u64 |
||||
} |
} |
||||
|
|
||||
extern "Rust" {} |
|
||||
|
|
||||
unsafe extern "C++" { |
unsafe extern "C++" { |
||||
include!("klotski/src/klotski.h"); |
include!("rust_ffi/include/common_code.h"); |
||||
|
|
||||
|
fn to_string(self: &RsCommonCode) -> String; |
||||
|
|
||||
|
fn from_string(s: &str) -> RsCommonCode; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
pub use ffi::RsCommonCode as CommonCode; |
||||
|
|
||||
// fn unwrap(self: &CommonCode) -> u64;
|
impl CommonCode { |
||||
|
pub fn unsafe_create(code: u64) -> CommonCode { |
||||
|
CommonCode { code } |
||||
|
} |
||||
|
|
||||
|
pub fn unwrap(self: &CommonCode) -> u64 { |
||||
|
self.code |
||||
|
} |
||||
|
|
||||
|
pub fn from_string(s: &str) -> CommonCode { |
||||
|
ffi::from_string(s) |
||||
|
} |
||||
|
} |
||||
|
|
||||
// fn from_string(s: &str) -> CommonCode;
|
impl PartialEq for CommonCode { |
||||
fn from_string() -> CommonCode; |
fn eq(&self, other: &Self) -> bool { |
||||
|
self.code == other.code |
||||
} |
} |
||||
} |
} |
||||
|
@ -1,8 +0,0 @@ |
|||||
#include "klotski/src/klotski.h" |
|
||||
#include "klotski/src/common_code.rs.h" |
|
||||
|
|
||||
#include <iostream> |
|
||||
|
|
||||
CommonCode from_string() { |
|
||||
return CommonCode {}; |
|
||||
} |
|
@ -1,5 +0,0 @@ |
|||||
#pragma once |
|
||||
|
|
||||
#include "klotski/src/common_code.rs.h" |
|
||||
|
|
||||
CommonCode from_string(); |
|
@ -1,12 +1,11 @@ |
|||||
mod common_code; |
mod common_code; |
||||
|
|
||||
use common_code::ffi::CommonCode; |
use common_code::CommonCode; |
||||
|
|
||||
fn main() { |
fn main() { |
||||
// let code = CommonCode { code: 123 };
|
let code = CommonCode::from_string("1A9BF0C"); |
||||
// let val = code.unwrap();
|
println!("code: {:?}", code.unwrap()); |
||||
// println!("val = {}", val);
|
println!("str: {}", code.to_string()); |
||||
|
|
||||
let code = common_code::ffi::from_string(); |
println!("{}", code == CommonCode::unsafe_create(0x1A9BF0C00)); |
||||
println!("code = {:?}", code); |
|
||||
} |
} |
||||
|
Loading…
Reference in new issue