diff options
Diffstat (limited to 'modules/codec')
-rw-r--r-- | modules/codec/c++/interface.hpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/modules/codec/c++/interface.hpp b/modules/codec/c++/interface.hpp index f77c05f..d6d02a3 100644 --- a/modules/codec/c++/interface.hpp +++ b/modules/codec/c++/interface.hpp @@ -35,6 +35,7 @@ public: error_or<data<Response, Encode>> call(data<Request, Encode> req, Context ctx = {}){ if constexpr (std::is_same_v<Context, void_t>){ + (void) ctx; return func_(std::move(req)); } else { return func_(std::move(req), ctx); @@ -50,17 +51,17 @@ public: }; -template<typename T, typename Encode, typename... Funcs> +template<typename T, typename Encode, typename Context = void_t > class interface; -template<typename... Requests, typename... Responses, string_literal... Names, typename Encode> -class interface<schema::Interface<schema::Member<schema::Function<Requests, Responses>, Names>...>, Encode> { +template<typename... Requests, typename... Responses, string_literal... Names, typename Encode, typename Context> +class interface<schema::Interface<schema::Member<schema::Function<Requests, Responses>, Names>...>, Encode, Context> { public: using Schema = schema::Interface<schema::Member<schema::Function<Requests, Responses>,Names>...>; private: - std::tuple<function<schema::Function<Requests, Responses>, Encode>...> funcs_; + std::tuple<function<schema::Function<Requests, Responses>, Encode, Context>...> funcs_; public: - interface(function<schema::Function<Requests, Responses>, Encode>... funcs): + interface(function<schema::Function<Requests, Responses>, Encode, Context>... funcs): funcs_{std::move(funcs)...} {} @@ -84,6 +85,7 @@ public: > , Encode + , Context >& get(){ return std::get<parameter_key_pack_index<Lit, Names...>::value>(funcs_); } @@ -103,26 +105,31 @@ public: Lit, Names... >::value , Requests...>::type - , Encode> req + , Encode> req, + Context ctx = {} ){ - return get<Lit>().call(std::move(req)); + if constexpr (std::is_same_v<Context, void_t>) { + (void) ctx; + return get<Lit>().call(std::move(req)); + }else{ + return get<Lit>().call(std::move(req), ctx); + } } - }; -template<typename T, typename Encode> +template<typename T, typename Encode, typename Context = void_t> struct function_factory { template<typename Func> - static function<T,Encode> create(Func func){ - return function<T,Encode>{std::move(func)}; + static function<T,Encode, Context> create(Func func){ + return function<T,Encode,Context> {std::move(func)}; } }; -template<typename T, typename Encode> +template<typename T, typename Encode, typename Context = void_t> struct interface_factory { template<typename... Func> - static interface<T,Encode> create(Func... func){ - return interface<T,Encode>{std::move(func)...}; + static interface<T,Encode,Context> create(Func... func){ + return interface<T,Encode,Context>{std::move(func)...}; } }; } |