Skip to content

Commit c759686

Browse files
committed
mfem-sys: Add casting functions
1 parent cd1781a commit c759686

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

crates/mfem-sys/src/ffi_autocxx.hpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,31 @@ namespace acxx {
1919
false;
2020
#endif
2121

22+
#define SUBCLASS(A, B) \
23+
/* Functions to cast A to a superclass B. */ \
24+
/* In C++ so errors can be caught by the type system */ \
25+
B* A##_as_mut_##B(A* x) { \
26+
return static_cast<B*>(x); \
27+
} \
28+
const B* A##_as_##B(const A* x) { \
29+
return static_cast<const B*>(x); \
30+
}
31+
32+
SUBCLASS(GridFunction, Vector)
33+
SUBCLASS(LinearForm, Vector)
34+
SUBCLASS(ConstantCoefficient, Coefficient)
35+
SUBCLASS(FunctionCoefficient, Coefficient)
36+
SUBCLASS(GridFunctionCoefficient, Coefficient)
37+
SUBCLASS(DomainLFIntegrator, DeltaLFIntegrator)
38+
SUBCLASS(DeltaLFIntegrator, LinearFormIntegrator)
39+
SUBCLASS(BilinearFormIntegrator, NonlinearFormIntegrator)
40+
SUBCLASS(DiffusionIntegrator, BilinearFormIntegrator)
41+
SUBCLASS(ConvectionIntegrator, BilinearFormIntegrator)
42+
SUBCLASS(Solver, Operator)
43+
SUBCLASS(MatrixInverse, Solver)
44+
SUBCLASS(SparseSmoother, MatrixInverse)
45+
SUBCLASS(GSSmoother, SparseSmoother)
46+
2247
const int NumBasisTypes = mfem::BasisType::NumBasisTypes;
2348

2449
Array<int> const& Mesh_bdr_attributes(Mesh const& mesh) {

crates/mfem-sys/src/ffi_cxx.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ Operator& upcast_to_operator_mut(T& x) {
1616
return x;
1717
}
1818

19-
Operator const& OperatorHandle_operator(OperatorHandle const& x) {
19+
Operator const& OperatorHandle_oper(OperatorHandle const& x) {
2020
return *x;
2121
}
2222

23-
Operator& OperatorHandle_operator_mut(OperatorHandle& x) {
23+
Operator& OperatorHandle_oper_mut(OperatorHandle& x) {
2424
return *x;
2525
}
2626

crates/mfem-sys/src/lib.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,26 @@ include_cpp! {
5252

5353
generate!("mfem::GridFunction")
5454
generate!("acxx::GridFunction_OwnFEC") // immutable version
55+
generate!("acxx::GridFunction_as_Vector")
56+
generate!("acxx::GridFunction_as_mut_Vector")
5557
generate!("mfem::LinearFormIntegrator")
5658
generate!("mfem::BilinearFormIntegrator")
5759
generate!("mfem::LinearForm")
60+
generate!("acxx::LinearForm_as_Vector")
61+
generate!("acxx::LinearForm_as_mut_Vector")
5862
generate!("mfem::BilinearForm")
5963
generate!("mfem::MixedBilinearForm")
6064

6165
generate!("mfem::Coefficient")
6266
generate!("mfem::ConstantCoefficient")
67+
generate!("acxx::ConstantCoefficient_as_Coefficient")
68+
generate!("acxx::ConstantCoefficient_as_mut_Coefficient")
6369
generate!("mfem::FunctionCoefficient")
70+
generate!("acxx::FunctionCoefficient_as_Coefficient")
71+
generate!("acxx::FunctionCoefficient_as_mut_Coefficient")
6472
generate!("mfem::GridFunctionCoefficient")
73+
generate!("acxx::GridFunctionCoefficient_as_Coefficient")
74+
generate!("acxx::GridFunctionCoefficient_as_mut_Coefficient")
6575
generate!("mfem::InnerProductCoefficient")
6676
generate!("mfem::VectorCoefficient")
6777
generate!("mfem::VectorConstantCoefficient")
@@ -71,13 +81,33 @@ include_cpp! {
7181
generate!("mfem::LinearFormIntegrator")
7282
generate!("mfem::DeltaLFIntegrator")
7383
generate!("mfem::DomainLFIntegrator")
84+
generate!("acxx::DomainLFIntegrator_as_DeltaLFIntegrator")
85+
generate!("acxx::DomainLFIntegrator_as_mut_DeltaLFIntegrator")
86+
generate!("acxx::DeltaLFIntegrator_as_LinearFormIntegrator")
87+
generate!("acxx::DeltaLFIntegrator_as_mut_LinearFormIntegrator")
7488
generate!("mfem::BilinearFormIntegrator")
89+
generate!("acxx::BilinearFormIntegrator_as_NonlinearFormIntegrator")
90+
generate!("acxx::BilinearFormIntegrator_as_mut_NonlinearFormIntegrator")
7591
generate!("mfem::DiffusionIntegrator")
92+
generate!("acxx::DiffusionIntegrator_as_BilinearFormIntegrator")
93+
generate!("acxx::DiffusionIntegrator_as_mut_BilinearFormIntegrator")
7694
generate!("mfem::ConvectionIntegrator")
95+
generate!("acxx::ConvectionIntegrator_as_BilinearFormIntegrator")
96+
generate!("acxx::ConvectionIntegrator_as_mut_BilinearFormIntegrator")
7797

7898
generate!("mfem::SparseMatrix")
7999
generate!("mfem::Solver")
100+
generate!("acxx::Solver_as_Operator")
101+
generate!("acxx::Solver_as_mut_Operator")
102+
generate!("mfem::MatrixInverse")
103+
generate!("acxx::MatrixInverse_as_Solver")
104+
generate!("acxx::MatrixInverse_as_mut_Solver")
105+
generate!("mfem::SparseSmoother")
106+
generate!("acxx::SparseSmoother_as_MatrixInverse")
107+
generate!("acxx::SparseSmoother_as_mut_MatrixInverse")
80108
generate!("mfem::GSSmoother")
109+
generate!("acxx::GSSmoother_as_SparseSmoother")
110+
generate!("acxx::GSSmoother_as_mut_SparseSmoother")
81111
generate!("mfem::PermuteFaceL2")
82112
}
83113

@@ -200,8 +230,8 @@ mod ffi_cxx {
200230
#[namespace = "mfem"]
201231
#[cxx_name = "OperatorHandle"]
202232
type OperatorHandleCxx = crate::OperatorHandle;
203-
fn OperatorHandle_operator<'a>(o: &'a OperatorHandleCxx) -> &'a Operator;
204-
fn OperatorHandle_operator_mut<'a>(
233+
fn OperatorHandle_oper<'a>(o: &'a OperatorHandleCxx) -> &'a Operator;
234+
fn OperatorHandle_oper_mut<'a>(
205235
o: Pin<&'a mut OperatorHandleCxx>,
206236
) -> Pin<&'a mut Operator>;
207237

0 commit comments

Comments
 (0)