Rex是一个远程函数组合执行框架。支持在Server端注册一些函数,可以是普通函数,也可以是coke框架中的协程函数,在Client端可以根据需求,选择其中的一些函数并灵活地指定函数参数和执行顺序,发往Server端执行完毕后,取回结果以供进一步使用。此外,也可以使用分支和循环组合成较为复杂的函数执行过程,为了便于编写,为整数和浮点数提供了四则运算和比较运算。
假设/vi32/函数集已经实现,则可以通过下述方法实现一个冒泡排序算法的函数组合,在实际应用中,当一个函数组合复杂到这种程度时,就应当考虑增加一个新的函数了,此示例仅为展示使用方法。
using Vi32 = std::vector<int32_t>;
rex::CommandBuilder b;
rex::Arg<Vi32> vec = b.arg<Vi32>("vector", {5, 2, 1, 3, 4});
rex::Arg<int32_t> i = b.arg<int32_t>(0);
rex::Arg<int32_t> n = b.remote<int32_t>("/vi32/size", vec);
b.remote_while(i < n, [&] {
rex::Arg<int32_t> j = b.arg<int32_t>(0);
rex::Arg<int32_t> m = n - i - b.arg<int32_t>(1);
rex::Arg<bool> swapped = b.arg<bool>(false);
b.remote_while(j < m, [&] {
rex::Arg<int32_t> k = j + b.arg<int32_t>(1);
rex::Arg<int32_t> x = b.remote<int32_t>("/vi32/at", vec, j);
rex::Arg<int32_t> y = b.remote<int32_t>("/vi32/at", vec, k);
b.remote_if(x > y, [&] {
b.remote<void>("/vi32/swap", vec, j, k);
swapped = b.arg<bool>(true);
});
j = j + b.arg<int32_t>(1);
});
b.remote_if(!swapped, [&] { b.remote_break(); });
i = i + b.arg<int32_t>(1);
});
b.add_return_arg("vector", vec);
// ...GCC >= 13
Apache 2.0