2323#include " casbin/rbac/role_manager.h"
2424
2525namespace casbin {
26+ using numerical_type = float ;
2627
27- template <typename T>
28- struct ExprtkGFunction : public exprtk ::igeneric_function<T>
28+ using symbol_table_t = exprtk::symbol_table<numerical_type>;
29+ using expression_t = exprtk::expression<numerical_type>;
30+ using parser_t = exprtk::parser<numerical_type>;
31+ using exprtk_func_t = exprtk::igeneric_function<numerical_type>;
32+
33+ struct ExprtkGFunction : public exprtk ::igeneric_function<numerical_type>
2934 {
30- typedef typename exprtk::igeneric_function<T >::generic_type
35+ typedef typename exprtk::igeneric_function<numerical_type >::generic_type
3136 generic_type;
3237
3338 typedef typename generic_type::scalar_view scalar_t ;
3439 typedef typename generic_type::vector_view vector_t ;
3540 typedef typename generic_type::string_view string_t ;
3641
37- typedef typename exprtk::igeneric_function<T >::parameter_list_t
42+ typedef typename exprtk::igeneric_function<numerical_type >::parameter_list_t
3843 parameter_list_t ;
3944 private:
4045 std::shared_ptr<casbin::RoleManager> rm_;
4146 public:
42- ExprtkGFunction ()
43- : exprtk::igeneric_function<T>( " SS " ), rm_(nullptr )
47+ ExprtkGFunction (const std::string& idenfier )
48+ : exprtk::igeneric_function<numerical_type>(idenfier ), rm_(nullptr )
4449 {}
4550
46- ExprtkGFunction (std::shared_ptr<RoleManager> rm)
47- : exprtk::igeneric_function<T>( " SS " ), rm_(rm)
51+ ExprtkGFunction (const std::string& idenfier, std::shared_ptr<RoleManager> rm)
52+ : exprtk::igeneric_function<numerical_type>(idenfier ), rm_(rm)
4853 {}
4954
5055 bool UpdateRoleManager (std::shared_ptr<RoleManager> rm) {
@@ -53,23 +58,23 @@ namespace casbin {
5358 return true ;
5459 }
5560
56- inline T operator ()(parameter_list_t parameters) {
61+ inline numerical_type operator ()(parameter_list_t parameters) {
5762 bool res = false ;
5863
5964 // check value cnt
60- if (parameters.size () < 2 || parameters.size () > 3 ) {
61- return T (res);
65+ if (parameters.size () != 2 && parameters.size () != 3 ) {
66+ return numerical_type (res);
6267 }
6368
6469 // check value type
6570 for (std::size_t i = 0 ; i < parameters.size (); ++i) {
6671 generic_type& gt = parameters[i];
6772
6873 if (generic_type::e_scalar == gt.type ) {
69- return T (res);
74+ return numerical_type (res);
7075 }
7176 else if (generic_type::e_vector == gt.type ) {
72- return T (res);
77+ return numerical_type (res);
7378 }
7479 }
7580
@@ -89,9 +94,25 @@ namespace casbin {
8994 res = rm_->HasLink (name1, name2, domains);
9095 }
9196
92- return T (res);
97+ return numerical_type (res);
9398 }
9499 };
100+
101+ enum class ExprtkFunctionType {
102+ Gfunction,
103+ };
104+
105+ class ExprtkFunctionFactory {
106+ public:
107+ static std::shared_ptr<exprtk_func_t > GetExprtkFunction (ExprtkFunctionType type, int narg, std::shared_ptr<RoleManager> rm = nullptr ) {
108+ if (type == ExprtkFunctionType::Gfunction) {
109+ std::string idenfier (narg, ' S' );
110+ return std::make_shared<ExprtkGFunction>(idenfier, rm);
111+ } else {
112+ return nullptr ;
113+ }
114+ }
115+ };
95116}
96117
97118
0 commit comments