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 +++++++++++++++++++++++++++++++- modules/tools/python/c_generate_iface.py | 1 + modules/tools/tests/c_iface.cpp | 17 ++++++ 3 files changed, 109 insertions(+), 3 deletions(-) create mode 100755 modules/tools/python/c_generate_iface.py (limited to 'modules') 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; + } } { diff --git a/modules/tools/python/c_generate_iface.py b/modules/tools/python/c_generate_iface.py new file mode 100755 index 0000000..e5a0d9b --- /dev/null +++ b/modules/tools/python/c_generate_iface.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/modules/tools/tests/c_iface.cpp b/modules/tools/tests/c_iface.cpp index 88899f7..01f1106 100644 --- a/modules/tools/tests/c_iface.cpp +++ b/modules/tools/tests/c_iface.cpp @@ -9,11 +9,20 @@ namespace { namespace schema { using namespace saw::schema; +using TestStruct = Struct< + Member, + Member +>; + using TestEmptyInterface = Interface<>; using TestOneFunctionInterface = Interface< Member, "one"> >; + +using TestStructFunctionInterface = Interface< + Member, "two"> +>; } template @@ -55,4 +64,12 @@ SAW_TEST("CIface One Function Interface"){ test_generate(res); std::cout<<"\n"<(res); + std::cout<<"\n"<