summaryrefslogtreecommitdiff
path: root/modules/lang/c++
diff options
context:
space:
mode:
Diffstat (limited to 'modules/lang/c++')
-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
4 files changed, 98 insertions, 1 deletions
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");