From da93f0466cdeaf266debe5bacee6779354cf4a34 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Wed, 14 Feb 2024 22:06:14 +0100 Subject: tools: Adding params and other dangling changes --- modules/tools/c++/c_gen_iface.hpp | 94 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 3 deletions(-) (limited to 'modules/tools/c++') diff --git a/modules/tools/c++/c_gen_iface.hpp b/modules/tools/c++/c_gen_iface.hpp index cdacc34..1b1e14d 100644 --- a/modules/tools/c++/c_gen_iface.hpp +++ b/modules/tools/c++/c_gen_iface.hpp @@ -17,7 +17,8 @@ namespace schema { using CVar = Struct< Member, Member, - Member + Member, + Member >; using CStruct = Struct< @@ -168,11 +169,12 @@ struct c_data_translater> { using Schema = schema::Primitive; static error_or generate(data& state, data& prim){ - /// @TODO Check if exists in CVars already try{ std::stringstream iss; schema_stringify::apply(iss); prim.template get<"schema">().set(iss.str()); + prim.template get<"is_primitive">().set(1); + prim.template get<"type">().set(std::string{c_primitive_string::value}); }catch(const std::exception&){ return make_error(); } @@ -181,10 +183,76 @@ struct c_data_translater> { } }; +template +struct c_data_translater> { + using Schema = schema::Array; + + static error_or generate(data& state){ + + return void_t{}; + } +}; + +template +struct c_data_translater> { + using Schema = schema::Struct; + + static error_or generate(data& state){ + + return void_t{}; + } +}; +template +struct c_parameter_translater { + static_assert(always_false, "Type not supported"); +}; + +template +struct c_parameter_translater...>> { + template + static error_or generate_ele(data& state, data>& params){ + using Type = typename parameter_pack_type::type; + constexpr string_literal Literal = parameter_key_pack_type::literal; + + { + auto c_var = data{}; + c_var.template get<"name">().set(std::string{Literal.view()}); + { + auto eov = c_data_translater::generate(state, c_var); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = params.add(std::move(c_var)); + if(eov.is_error()){ + return eov; + } + } + } + + if constexpr ( (i+1) < sizeof...(V) ) { + return generate_ele(state, params); + } + return void_t{}; + } + + static error_or generate(data& state, data>& params){ + if constexpr ( sizeof...(V) > 0){ + return generate_ele<0>(state, params); + } + return void_t{}; + } +}; + template struct c_data_translater> { using Schema = schema::Function; + static error_or generate_struct_params(data& state, data>& params){ + return c_parameter_translater::generate(state, params); + } + static error_or generate(data& state, const std::string_view& func_name){ if(c_interface_function_exists(state, func_name)){ return make_error("Function already exists"); @@ -213,7 +281,27 @@ struct c_data_translater> { } // Request values - { + auto& params = function.template get<"params">(); + if constexpr (is_primitive::value){ + auto c_var = data{}; + c_var.template get<"name">().set("req_val"); + { + auto eov = c_data_translater::generate(state, c_var); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = params.add(std::move(c_var)); + if(eov.is_error()){ + return eov; + } + } + } else { + auto eov = generate_struct_params(state, params); + if(eov.is_error()){ + return eov; + } } { -- cgit v1.2.3