braft
braft copied to clipboard
Rust/C binding可行吗
我们的项目是Rust语言,braft特别适合我们的很多场景,Rust可以无缝调用C的类库,查过一些资料,说符合"某些"要求的C++库是可以提供C binding的,比如snappy是C++的,但是提供了C binding,想问下技术上给braft增加一个Rust或者说C binding是可行的吗?谢谢!
可能比较难,raft得接口较多,直接提供c-binding的话工作量还是不小的
如果技术上可行的话我们可以投入人力做,这边没有熟悉C++的同学,想问下写这个c-binding的大概方法是什么?是像snappy那样通过snappy-c.cc做一个C到C++的wrap层吗?
c-binding理论上可行,就是接口看起来会比较恶心 braft的C++接口主要就是StateMachine那堆虚函数,加上Node里面一些功能。基本思路就是,每个虚函数对应一个函数指针,Node里的每个成员函数变成一个函数调用,大概长这个样子:
//==================
// c wrapper
typedef void(BraftIterator*) OnApplyFunction;
class BraftStateMachineForC : public StateMachine {
public:
void set_on_apply(OnApplyFunction on_apply_function) {
on_apply_func_ = on_apply_function;
}
void Start() { ... }
protected:
void on_apply(Iterator& it) {
on_apply_func_(&it);
}
private:
OnApplyFunction on_apply_func_;
};
extern "C"
{
typedef void* BraftStateMachinePtr;
BraftStateMachinePtr create_state_machine(...) {
return new BraftStateMachine(...);
}
void set_on_apply_function(BraftStateMachinePtr* sm, OnApplyFunction func) {
((BraftStateMachine*)sm) -> set_on_apply(func);
}
void start_state_machine(BraftStateMachinePtr* sm) {
((BraftStateMachine*)sm) ->Start();
}
}
//==================
// c code example
BraftStateMachinePtr state_machine = create_state_machine(...);
set_on_apply_function(state_machine, func);
// ... 这里还需要set一大堆 on_xxx 函数
start_state_machine(state_machine);
// ....
请问下这个有计划弄吗?