summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/codec/c++/transport.hpp18
-rw-r--r--modules/io_codec/c++/io_peer.hpp22
-rw-r--r--modules/io_codec/c++/io_peer.tmpl.hpp36
-rw-r--r--modules/io_codec/examples/peer_echo_client.cpp4
-rw-r--r--modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp1
-rw-r--r--modules/tools/c++/c_gen_iface.hpp146
-rw-r--r--modules/tools/tests/c_iface.cpp3
7 files changed, 181 insertions, 49 deletions
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp
index db277d1..430f719 100644
--- a/modules/codec/c++/transport.hpp
+++ b/modules/codec/c++/transport.hpp
@@ -1,5 +1,8 @@
#pragma once
+#include <forstio/buffer.hpp>
+#include "data.hpp"
+
namespace saw {
namespace transport {
template<uint64_t Len = 8u>
@@ -12,23 +15,16 @@ struct NewLine {};
struct CarriageReturnNewLine {};
}
-template<typename Transport>
-struct transport {
-private:
- static_assert(always_false<Transport>, "Transport kind not supported.");
-public:
-
-
-template<uint64_t Len>
-struct transport<transport::FixedLength<Len>> {
+template<typename Schema, uint64_t Len>
+struct codec<Schema, transport::FixedLength<Len>> {
private:
public:
- error_or<buffer_view> view_slice(const buffer& buff) const {
+ error_or<buffer_view> view_slice(buffer& buff) const {
(void) buff;
return make_error<err::not_implemented>();
}
- error_or<array_buffer> chain_slice(buffer& buff) const {
+ error_or<array_buffer> chain_slice(chain_array_buffer& buff) const {
(void) buff;
return make_error<err::not_implemented>();
}
diff --git a/modules/io_codec/c++/io_peer.hpp b/modules/io_codec/c++/io_peer.hpp
index f576cbe..613f60e 100644
--- a/modules/io_codec/c++/io_peer.hpp
+++ b/modules/io_codec/c++/io_peer.hpp
@@ -11,19 +11,21 @@ template <typename Incoming, typename Outgoing,
typename TransportEncoding, typename ContentEncoding,
typename BufferT = ring_buffer>
class streaming_io_peer {
+private:
+ static_assert(not std::is_same_v<ContentEncoding, encode::Native>, "The native encoding by definition is not fit for transport.");
public:
/**
* Constructor with the option to provide a custom codec, in and out buffer
*/
streaming_io_peer(
- own<conveyor_feeder<data<Incoming, Encoding>>> feed,
- own<async_io_stream> stream, codec<Incoming, Encoding> in_codec, codec<Outgoing, Encoding> out_codec, BufferT in, BufferT out);
+ own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed,
+ own<async_io_stream> stream, codec<Incoming, TransportEncoding> in_codec, codec<Outgoing, TransportEncoding> out_codec, BufferT in, BufferT out);
/**
* Constructor with mostly default assignements
*/
streaming_io_peer(
- own<conveyor_feeder<data<Incoming, Encoding>>> feed,
+ own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed,
own<async_io_stream> stream);
/**
@@ -35,25 +37,25 @@ public:
/**
* Send a message to the remote peer
*/
- error_or<void> send(data<Outgoing> builder);
+ error_or<void> send(data<Outgoing, ContentEncoding> builder);
/**
* A phantom conveyor feeder. Meant for interfacing with other components
*/
- conveyor_feeder<data<Outgoing, Encoding>> &feeder();
+ conveyor_feeder<data<Outgoing, ContentEncoding>> &feeder();
conveyor<void> on_read_disconnected();
private:
/// @unimplemented
class peer_conveyor_feeder final
- : public conveyor_feeder<data<Outgoing, Encoding>> {
+ : public conveyor_feeder<data<Outgoing, ContentEncoding>> {
public:
peer_conveyor_feeder(
streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT> &peer_)
: peer_{peer_} {}
- void feed(data<Outgoing, Encoding> &&data_) override {
+ void feed(data<Outgoing, ContentEncoding> &&data_) override {
(void)data_;
}
@@ -63,14 +65,14 @@ private:
size_t queued() const override { return 0; }
- error_or<void> swap(conveyor<data<Outgoing, Encoding>> &&conveyor) noexcept override { return make_error<err::not_implemented>();}
+ error_or<void> swap(conveyor<data<Outgoing, ContentEncoding>> &&) noexcept override { return make_error<err::not_implemented>();}
private:
streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,
BufferT> &peer_;
};
private:
- own<conveyor_feeder<data<Incoming, Encoding>>>
+ own<conveyor_feeder<data<Incoming, ContentEncoding>>>
incoming_feeder_ = nullptr;
own<async_io_stream> io_stream_;
@@ -95,7 +97,7 @@ template <typename Incoming, typename Outgoing,
typename TransportEncoding, typename ContentEncoding,
typename BufferT = ring_buffer>
std::pair<own<streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT>>,
- conveyor<data<Incoming, Encoding>>>
+ conveyor<data<Incoming, ContentEncoding>>>
new_streaming_io_peer(own<async_io_stream> stream);
} // namespace saw
diff --git a/modules/io_codec/c++/io_peer.tmpl.hpp b/modules/io_codec/c++/io_peer.tmpl.hpp
index d9dfe04..b7ccb49 100644
--- a/modules/io_codec/c++/io_peer.tmpl.hpp
+++ b/modules/io_codec/c++/io_peer.tmpl.hpp
@@ -1,20 +1,20 @@
namespace saw {
-template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding
+template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding,
typename BufferT>
streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,
BufferT>::
streaming_io_peer(
- own<conveyor_feeder<data<Incoming, Encoding>>> feed,
+ own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed,
own<async_io_stream> str)
: streaming_io_peer{std::move(feed), std::move(str), {}, {}, {}, {}} {}
-template <typename Incoming, typename Outgoing, typename TransportEncoding, ContentEncoding, typename BufferT>
+template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT>
streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,
BufferT>::
streaming_io_peer(
- own<conveyor_feeder<data<Incoming, Encoding>>> feed,
- own<async_io_stream> stream, codec<Incoming, Encoding> in_codec, codec<Outgoing, Encoding> out_codec, BufferT in, BufferT out)
+ own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed,
+ own<async_io_stream> stream, codec<Incoming, TransportEncoding> in_codec, codec<Outgoing, TransportEncoding> out_codec, BufferT in, BufferT out)
: incoming_feeder_{std::move(feed)},
io_stream_{std::move(stream)},
in_codec_{std::move(in_codec)},
@@ -34,7 +34,7 @@ streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,
while (true) {
buffer_view in_view{in_buffer_};
- auto in_data = data<Incoming, Encoding>{in_view};
+ auto in_data = data<Incoming, TransportEncoding>{in_view};
incoming_feeder_->feed(std::move(in_data));
}
@@ -61,14 +61,14 @@ streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,
io_stream_->read(&in_buffer_.write(), 1, in_buffer_.write_segment_length());
}
-template <typename Incoming, typename Outgoing,
- typename Encoding, typename BufferT>
-error_or<void> streaming_io_peer<Incoming, Outgoing, Encoding,
- BufferT>::send(data<Outgoing>
+template <typename Incoming, typename Outgoing, typename TransportEncoding,
+ typename ContentEncoding, typename BufferT>
+error_or<void> streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,
+ BufferT>::send(data<Outgoing, ContentEncoding>
msg) {
bool restart_write = out_buffer_.read_segment_length() == 0;
- data<Outgoing, Encoding> enc;
+ data<Outgoing, TransportEncoding> enc;
auto eov =
out_codec_.encode(msg, enc);//msg.read(), out_buffer_);
@@ -84,22 +84,22 @@ error_or<void> streaming_io_peer<Incoming, Outgoing, Encoding,
return void_t{};
}
-template <typename Incoming, typename Outgoing, typename Encoding,
+template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding,
typename BufferT>
conveyor<void>
-streaming_io_peer<Incoming, Outgoing, Encoding,
+streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,
BufferT>::on_read_disconnected() {
return io_stream_->on_read_disconnected();
}
-template <typename Incoming, typename Outgoing, typename Encoding, typename BufferT>
-std::pair<own<streaming_io_peer<Incoming, Outgoing, Encoding, BufferT>>,
- conveyor<data<Incoming,Encoding>>>
+template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT>
+std::pair<own<streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT>>,
+ conveyor<data<Incoming,ContentEncoding>>>
new_streaming_io_peer(own<async_io_stream> stream) {
auto caf =
- new_conveyor_and_feeder<data<Incoming, Encoding>>();
+ new_conveyor_and_feeder<data<Incoming, ContentEncoding>>();
- return {heap<streaming_io_peer<Incoming, Outgoing, Encoding,BufferT>>(
+ return {heap<streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,BufferT>>(
std::move(caf.feeder), std::move(stream)),
std::move(caf.conveyor)};
}
diff --git a/modules/io_codec/examples/peer_echo_client.cpp b/modules/io_codec/examples/peer_echo_client.cpp
index f1836e4..b09a51a 100644
--- a/modules/io_codec/examples/peer_echo_client.cpp
+++ b/modules/io_codec/examples/peer_echo_client.cpp
@@ -4,6 +4,8 @@
#include <iostream>
+#include <forstio/codec/transport.hpp>
+
int main(){
using namespace saw;
@@ -34,7 +36,7 @@ int main(){
network.connect(*addr).then([](saw::own<saw::io_stream> client){
auto echo_stream = saw::heap<saw::async_io_stream>(std::move(client));
- auto echo_peer_stream_p = saw::new_streaming_io_peer<sch::Echo, sch::Echo, encode::KelSimple, ring_buffer>(std::move(echo_stream));
+ auto echo_peer_stream_p = saw::new_streaming_io_peer<sch::Echo, sch::Echo, transport::FixedLength<8u>, encode::KelSimple, ring_buffer>(std::move(echo_stream));
echo_peer_stream_p.first->on_read_disconnected().attach(std::move(echo_peer_stream_p.first)).detach();
}).detach();
diff --git a/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp b/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp
index 591ded2..e99de53 100644
--- a/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp
+++ b/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp
@@ -12,6 +12,7 @@ saw::interface<sch::MixedPrecisionBenchmarkInterface, saw::encode::Native, saw::
auto acc_buff = in.template access<cl::sycl::access::mode::read_write>(h);
h.parallel_for(cl::sycl::range<1>(in_size), [=] (cl::sycl::id<1> it){
+
saw::data<sch::Float64> foo = {acc_buff[0u].at(it[0u]).get()};
for(uint64_t i = 0; i < arithmetic_intensity; ++i){
if( foo.get() == 1.1e12 ){
diff --git a/modules/tools/c++/c_gen_iface.hpp b/modules/tools/c++/c_gen_iface.hpp
index 3a648a1..4fa881c 100644
--- a/modules/tools/c++/c_gen_iface.hpp
+++ b/modules/tools/c++/c_gen_iface.hpp
@@ -159,8 +159,10 @@ struct lang_bind_helper {
}
template<typename Schema>
- static error_or<void> append_translation_func(std::string& buff, const std::string_view& prefix, bool c_to_cpp){
+ static error_or<void> append_translation_func(std::string& buff, const std::string_view& prefix, bool c_to_cpp, bool with_return_type = true){
constexpr uint32_t hash = schema_hash<Schema>::apply();
+
+ if(with_return_type)
{
auto eov = lang_bind_helper::append_string(buff, "saw::error_or<void> ");
if(eov.is_error()){
@@ -488,29 +490,127 @@ struct lang_bind<schema::Struct<schema::Member<V,K>...>, binding::SyncC> {
using Schema = schema::Struct<schema::Member<V,K>...>;
template<uint64_t i>
- static error_or<void> generate_translation_func(const language_binding_config& cfg, language_binding_state& state, std::string& buff, bool c_to_cpp){
+ static error_or<void> generate_translation_func(const language_binding_config& cfg, language_binding_state& state, bool c_to_cpp, uint64_t id){
using MT = typename parameter_pack_type<i,V...>::type;
static constexpr string_literal Lit = parameter_key_pack_type<i,K...>::literal;
constexpr uint32_t hash = schema_hash<MT>::apply();
auto& tpe = state.tp_elements;
- uint64_t id;
+ if constexpr (i == 0){
+ auto eov = lang_bind_helper::append_translation_func<Schema>(tpe.at(id).source, cfg.prefix, c_to_cpp);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if constexpr (i == 0)
{
- std::string hash_type_str = cfg.prefix + "_" + std::to_string(hash) + "_t";
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "{\n\t");
+ if(eov.is_error()){
+ return eov;
+ }
}
{
- auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\treturn void_t{};\n}\n");
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "{\n\t\tauto eov = ");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ auto eov = lang_bind_helper::append_hashed_type(tpe.at(id).source, cfg.prefix, hash);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ std::string_view trans = c_to_cpp ? "_translate_c_to_cpp (" : "_translate_cpp_to_c (";
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, trans);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "&((*c_val).");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()});
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "), cpp_val.template get<\"");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()});
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\">()");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(!c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, " cpp_val.template get<\"");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(!c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()});
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(!c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\">(), &((*c_val).");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ if(!c_to_cpp){
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()});
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, ") );\n\t\t");//cpp_output.set(*c_input);\n");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "if(eov.is_error()) return eov.get_error();\n\t}\n\t");//cpp_output.set(*c_input);\n");
if(eov.is_error()){
return eov;
}
}
+ if constexpr ( (i+1) < sizeof...(V) ){
+ return generate_translation_func<i+1u>(cfg, state, c_to_cpp, id);
+ }
+
+ {
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "return void_t{};\n}\n");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
return void_t{};
}
template<uint64_t i>
- static error_or<void> generate_ele(const language_binding_config& cfg, language_binding_state& state, int64_t id){
+ static error_or<void> generate_ele(const language_binding_config& cfg, language_binding_state& state, uint64_t id){
using MT = typename parameter_pack_type<i,V...>::type;
static constexpr string_literal Lit = parameter_key_pack_type<i,K...>::literal;
@@ -621,14 +721,16 @@ struct lang_bind<schema::Struct<schema::Member<V,K>...>, binding::SyncC> {
return eov;
}
}
+ if constexpr ( sizeof...(V) > 0 )
{
- auto eov = generate_translation_func<0>(tpe.at(id).source, cfg.prefix, true);
+ auto eov = generate_translation_func<0>(cfg, state, true, id);
if(eov.is_error()){
return eov;
}
}
+ if constexpr ( sizeof...(V) > 0 )
{
- auto eov = generate_translation_func<0>(tpe.at(id).source, cfg.prefix, false);
+ auto eov = generate_translation_func<0>(cfg, state, false, id);
if(eov.is_error()){
return eov;
}
@@ -741,6 +843,34 @@ struct lang_bind<schema::Array<T,D>, binding::SyncC> {
return eov;
}
}
+ /**
+ * Source
+ */
+ {
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "namespace {\n");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ auto eov = lang_bind_helper::append_translation_func<Schema>(tpe.at(id).source, cfg.prefix, true);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ auto eov = lang_bind_helper::append_translation_func<Schema>(tpe.at(id).source, cfg.prefix, false);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\n}\n");
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+
}
return void_t{};
diff --git a/modules/tools/tests/c_iface.cpp b/modules/tools/tests/c_iface.cpp
index 35591f8..25a5d04 100644
--- a/modules/tools/tests/c_iface.cpp
+++ b/modules/tools/tests/c_iface.cpp
@@ -19,7 +19,8 @@ using TestArray = Array<
>;
using TestStructArray = Struct<
- Member<TestArray, "array">
+ Member<TestArray, "array">,
+ Member<UInt64, "un_int_num">
>;
using TestStructMore = Struct<