summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/core/c++/templates.hpp6
-rw-r--r--modules/lang/c++/c_common.hpp49
-rw-r--r--modules/lang/c++/c_language.hpp7
-rw-r--r--modules/lang/c++/c_transfer.hpp39
-rw-r--r--modules/lang/c++/c_types.hpp4
-rw-r--r--modules/lang/examples/SConscript4
-rw-r--r--modules/lang/examples/c_example.cpp17
7 files changed, 123 insertions, 3 deletions
diff --git a/modules/core/c++/templates.hpp b/modules/core/c++/templates.hpp
index 9f629da..fc9d368 100644
--- a/modules/core/c++/templates.hpp
+++ b/modules/core/c++/templates.hpp
@@ -13,6 +13,9 @@ struct tmpl_group {
static constexpr string_literal name = "tmpl_group";
};
+/**
+ * Concats two tmpl_group into one
+ */
template<typename T, typename U>
struct tmpl_concat;
@@ -21,6 +24,9 @@ struct tmpl_concat<tmpl_group<T...>, tmpl_group<U...>> {
using type = tmpl_group<T..., U...>;
};
+/**
+ * Returns the position of the parameter type in the parameter pack
+ */
template <class T, class... TL> struct parameter_pack_index;
template <class T, class... TL> struct parameter_pack_index<T, T, TL...> {
diff --git a/modules/lang/c++/c_common.hpp b/modules/lang/c++/c_common.hpp
index 6999126..968c4c0 100644
--- a/modules/lang/c++/c_common.hpp
+++ b/modules/lang/c++/c_common.hpp
@@ -4,4 +4,53 @@ namespace saw {
namespace lang {
struct RemoteC {};
}
+
+namespace lang_c {
+struct config {
+ std::string prefix;
+};
+
+struct transfer_binding_state {
+ struct info {
+ std::string type;
+ };
+
+ std::map<uint32_t, binding_state::info> hashes;
+
+ struct transpiled_element {
+ uint32_t crc32;
+ std::string header;
+ std::string source;
+ };
+
+ std::vector<transfer_binding_state::transpiled_element> tp_elements;
+
+ error_or<uint64_t> find_id_by_crc32(uint32_t hash){
+ for(uint64_t iter = 0; iter < tp_elements.size(); ++iter){
+ if(tp_elements.at(iter).crc32 == hash){
+ return iter;
+ }
+ }
+
+ return make_error<err::not_found>();
+ }
+
+ error_or<uint64_t> add_tp_element(uint32_t hash){
+ uint64_t id{};
+
+ try {
+ language_binding_state::transpiled_element ele;
+
+ ele.crc32 = hash;
+
+ id = tp_elements.size();
+ tp_elements.emplace_back(std::move(ele));
+ }catch(const std::exception&){
+ return make_error<err::out_of_memory>();
+ }
+
+ return id;
+ }
+};
+}
}
diff --git a/modules/lang/c++/c_language.hpp b/modules/lang/c++/c_language.hpp
index c4b1d48..db3c97e 100644
--- a/modules/lang/c++/c_language.hpp
+++ b/modules/lang/c++/c_language.hpp
@@ -1,7 +1,7 @@
#pragma once
-#include "c_transfer.hpp"
#include "c_helper.hpp"
+#include "c_transfer.hpp"
#include "c_rpc.hpp"
namespace saw {
@@ -12,6 +12,11 @@ public:
std::string prefix;
};
public:
+ error_or<void> generate_transfer(const config& cfg){
+
+ return make_error<err::not_implemented>();
+ }
+
error_or<void> generate_rpc(const config& cfg){
return make_error<err::not_implemented>();
}
diff --git a/modules/lang/c++/c_transfer.hpp b/modules/lang/c++/c_transfer.hpp
index 5de204c..953f732 100644
--- a/modules/lang/c++/c_transfer.hpp
+++ b/modules/lang/c++/c_transfer.hpp
@@ -4,4 +4,43 @@
#include "c_types.hpp"
namespace saw {
+namespace impl {
+template<typename T, typename Enc>
+struct c_transfer_generater;
+
+template<typename T, typename Enc>
+struct c_transfer_generater<T,Enc> {
+public:
+ static error_or<void> apply (const lang_c::config& cfg, lang_c::transfer_binding_state& state){
+
+ return make_error<err::not_implemented>();
+ }
+};
+
+template<typename... TransTypes, typename Enc>
+struct c_transfer_generater<tmpl_group<TransTypes...>, Enc> {
+private:
+ // Not used currently
+ using ReducedTmplGroup = typename tmpl_reduce<tmpl_group<TransTypes...>>::type;
+private:
+ template<uint64_t i>
+ static error_or<void> apply_ele(const lang_c::config& cfg, lang_c::transfer_binding_state& state){
+ if constexpr ( i < sizeof...(TransTypes)){
+ {
+ using pType = typename parameter_pack_type<i, TransTypes...>::type;
+ auto eov = c_transfer_generater<pType, Enc>::apply(cfg,state);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ return apply_ele<i+1u>(cfg,state);
+ }
+ return make_void();
+ }
+public:
+ static error_or<void> apply(const lang_c::config& cfg, lang_c::transfer_binding_state& state){
+ return apply_ele<0u>(cfg, state);
+ }
+};
+}
}
diff --git a/modules/lang/c++/c_types.hpp b/modules/lang/c++/c_types.hpp
index ff3f5a8..16829f4 100644
--- a/modules/lang/c++/c_types.hpp
+++ b/modules/lang/c++/c_types.hpp
@@ -18,6 +18,10 @@ struct c_is_primitive<schema::Primitive<T,N>> {
static constexpr bool value = true;
};
+/**
+ * Returns the string of the name and type of the primitive in C
+ * The name value provides information on how that element should be named.
+ */
template<typename Schema>
struct c_primitive_string {
static_assert(always_false<Schema>, "Not supported");
diff --git a/modules/lang/examples/SConscript b/modules/lang/examples/SConscript
index 99561e7..684d410 100644
--- a/modules/lang/examples/SConscript
+++ b/modules/lang/examples/SConscript
@@ -19,10 +19,10 @@ env.sources += examples_env.sources;
env.headers += examples_env.headers;
objects_static = []
-examples_env.cli_mod = examples_env.Program('#bin/cli_mod_example', ['cli_mod.cpp', env.library_static]);
+examples_env.c_example = examples_env.Program('#bin/c_example', ['c_example.cpp', env.library_static]);
# Set Alias
-env.examples = [examples_env.cli_mod];
+env.examples = [examples_env.c_example];
env.Alias('examples', env.examples);
if env["build_examples"]:
diff --git a/modules/lang/examples/c_example.cpp b/modules/lang/examples/c_example.cpp
new file mode 100644
index 0000000..f15db93
--- /dev/null
+++ b/modules/lang/examples/c_example.cpp
@@ -0,0 +1,17 @@
+#include <forstio/error.hpp>
+
+saw::error_or<void> real_main(int argc, char** argv){
+ using namespace saw;
+ return make_void();
+}
+
+int main(int argc, char** argv){
+ auto eov = real_main(argc, argv);
+ if(eov.is_error()){
+ auto& err = eov.get_error();
+ std::cerr<<"Error: "<<err.get_category()<<" - "<<err.get_message();
+ return err.get_id();
+ }
+
+ return 0;
+}