summaryrefslogtreecommitdiff
path: root/modules/codec
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-05-15 11:11:35 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-05-15 11:11:35 +0200
commit1fea63acc752aa09bc6fc3d05b5b69d699202b60 (patch)
tree45d640b219b3f1796346baecba29d5163031761a /modules/codec
parent32b2517187efd8f434008fbb43924af703c84740 (diff)
Add a default typed template parameter to functions
Diffstat (limited to 'modules/codec')
-rw-r--r--modules/codec/c++/interface.hpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/modules/codec/c++/interface.hpp b/modules/codec/c++/interface.hpp
index 19dc145..f77c05f 100644
--- a/modules/codec/c++/interface.hpp
+++ b/modules/codec/c++/interface.hpp
@@ -3,25 +3,42 @@
#include <functional>
#include <forstio/error.hpp>
+
#include "schema.hpp"
#include "data.hpp"
namespace saw {
-template<typename SchemaFunc, typename Encode>
+template<typename SchemaFunc, typename Encode, typename Context = void_t >
class function;
+namespace impl {
+template<typename Request, typename Response, typename Encode, typename Ctx>
+struct FuncTypeHelper {
+ using Type = std::function<data<Response, Encode>(data<Request, Encode>, Ctx)>;
+};
+
template<typename Request, typename Response, typename Encode>
-class function<schema::Function<Request, Response>, Encode> {
+struct FuncTypeHelper<Request, Response, Encode, void_t> {
+ using Type = std::function<data<Response, Encode>(data<Request, Encode>)>;
+};
+}
+
+template<typename Request, typename Response, typename Encode, typename Context>
+class function<schema::Function<Request, Response>, Encode, Context> {
private:
- std::function<data<Response, Encode>(data<Request, Encode>)> func_;
+ typename impl::FuncTypeHelper<Request, Response, Encode, Context>::Type func_;
public:
template<typename Func>
function(Func func):
func_{std::move(func)}
{}
- error_or<data<Response, Encode>> call(data<Request, Encode> req){
+ error_or<data<Response, Encode>> call(data<Request, Encode> req, Context ctx = {}){
+ if constexpr (std::is_same_v<Context, void_t>){
return func_(std::move(req));
+ } else {
+ return func_(std::move(req), ctx);
+ }
}
};