summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-11 16:07:52 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-11 16:07:52 +0200
commitb9a4cf706cf0145c814ef5987dad21ebc4172ac6 (patch)
tree819d239b6d8b60b73fb0d1d1dd336a46ccbef1e1
parent5d39089e1821598bf599a67b3723509f78ebd8cd (diff)
wip
-rw-r--r--modules/codec-unit/.nix/derivation.nix36
-rw-r--r--modules/codec-unit/SConstruct72
-rw-r--r--modules/codec-unit/c++/SConscript38
-rw-r--r--modules/codec-unit/tests/SConscript31
-rw-r--r--modules/codec-unit/tests/codec-unit.cpp14
-rw-r--r--modules/codec/c++/transport.hpp4
-rw-r--r--modules/remote/c++/remote_loopback.hpp2
-rw-r--r--modules/remote/c++/remote_loopback_base.hpp30
-rw-r--r--modules/remote/c++/transfer_loopback.hpp41
9 files changed, 263 insertions, 5 deletions
diff --git a/modules/codec-unit/.nix/derivation.nix b/modules/codec-unit/.nix/derivation.nix
new file mode 100644
index 0000000..a66450e
--- /dev/null
+++ b/modules/codec-unit/.nix/derivation.nix
@@ -0,0 +1,36 @@
+{ lib
+, stdenv
+, scons
+, clang-tools
+, version
+, forstio
+}:
+
+let
+
+in stdenv.mkDerivation {
+ pname = "forstio-codec-json";
+ inherit version;
+ src = ./..;
+
+ enableParallelBuilding = true;
+
+ nativeBuildInputs = [
+ scons
+ clang-tools
+ ];
+
+ buildInputs = [
+ forstio.core
+ forstio.async
+ forstio.codec
+ ];
+
+ doCheck = true;
+ checkPhase = ''
+ scons test
+ ./bin/tests
+ '';
+
+ outputs = ["out" "dev"];
+}
diff --git a/modules/codec-unit/SConstruct b/modules/codec-unit/SConstruct
new file mode 100644
index 0000000..50c6eb9
--- /dev/null
+++ b/modules/codec-unit/SConstruct
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+
+import sys
+import os
+import os.path
+import glob
+import re
+
+
+if sys.version_info < (3,):
+ def isbasestring(s):
+ return isinstance(s,basestring)
+else:
+ def isbasestring(s):
+ return isinstance(s, (str,bytes))
+
+def add_kel_source_files(self, sources, filetype, lib_env=None, shared=False, target_post=""):
+
+ if isbasestring(filetype):
+ dir_path = self.Dir('.').abspath
+ filetype = sorted(glob.glob(dir_path+"/"+filetype))
+
+ for path in filetype:
+ target_name = re.sub( r'(.*?)(\.cpp|\.c\+\+)', r'\1' + target_post, path )
+ if shared:
+ target_name+='.os'
+ sources.append( self.SharedObject( target=target_name, source=path ) )
+ else:
+ target_name+='.o'
+ sources.append( self.StaticObject( target=target_name, source=path ) )
+ pass
+
+def isAbsolutePath(key, dirname, env):
+ assert os.path.isabs(dirname), "%r must have absolute path syntax" % (key,)
+
+env_vars = Variables(
+ args=ARGUMENTS
+)
+
+env_vars.Add('prefix',
+ help='Installation target location of build results and headers',
+ default='/usr/local/',
+ validator=isAbsolutePath
+)
+
+env=Environment(ENV=os.environ, variables=env_vars, CPPPATH=[],
+ CXX=['c++'],
+ CPPDEFINES=['SAW_UNIX'],
+ CXXFLAGS=['-std=c++20','-g','-Wall','-Wextra'],
+ LIBS=[
+ 'forstio-core'
+ ,'forstio-codec'
+ ]
+);
+env.__class__.add_source_files = add_kel_source_files
+env.Tool('compilation_db');
+env.cdb = env.CompilationDatabase('compile_commands.json');
+
+env.objects = [];
+env.sources = [];
+env.headers = [];
+env.targets = [];
+
+Export('env')
+SConscript('c++/SConscript')
+SConscript('tests/SConscript')
+
+env.Alias('cdb', env.cdb);
+env.Alias('all', [env.targets]);
+env.Default('all');
+
+env.Alias('install', '$prefix')
diff --git a/modules/codec-unit/c++/SConscript b/modules/codec-unit/c++/SConscript
new file mode 100644
index 0000000..241ddcf
--- /dev/null
+++ b/modules/codec-unit/c++/SConscript
@@ -0,0 +1,38 @@
+#!/bin/false
+
+import os
+import os.path
+import glob
+
+
+Import('env')
+
+dir_path = Dir('.').abspath
+
+# Environment for base library
+codec_unit_env = env.Clone();
+
+codec_unit_env.sources = sorted(glob.glob(dir_path + "/*.cpp"))
+codec_unit_env.headers = sorted(glob.glob(dir_path + "/*.hpp"))
+
+env.sources += codec_unit_env.sources;
+env.headers += codec_unit_env.headers;
+
+## Shared lib
+objects_shared = []
+codec_unit_env.add_source_files(objects_shared, codec_unit_env.sources, shared=True);
+env.library_shared = codec_unit_env.SharedLibrary('#build/forstio-codec-json', [objects_shared]);
+
+## Static lib
+objects_static = []
+codec_unit_env.add_source_files(objects_static, codec_unit_env.sources, shared=False);
+env.library_static = codec_unit_env.StaticLibrary('#build/forstio-codec-json', [objects_static]);
+
+# Set Alias
+env.Alias('library_codec_unit', [env.library_shared, env.library_static]);
+
+env.targets += ['library_codec_unit'];
+
+# Install
+env.Install('$prefix/lib/', [env.library_shared, env.library_static]);
+env.Install('$prefix/include/forstio/codec/json/', [codec_unit_env.headers]);
diff --git a/modules/codec-unit/tests/SConscript b/modules/codec-unit/tests/SConscript
new file mode 100644
index 0000000..f8ffc92
--- /dev/null
+++ b/modules/codec-unit/tests/SConscript
@@ -0,0 +1,31 @@
+#!/bin/false
+
+import os
+import os.path
+import glob
+
+
+Import('env')
+
+dir_path = Dir('.').abspath
+
+# Environment for base library
+test_cases_env = env.Clone();
+
+test_cases_env.Append(LIBS=['forstio-test']);
+
+test_cases_env.sources = sorted(glob.glob(dir_path + "/*.cpp"))
+test_cases_env.headers = sorted(glob.glob(dir_path + "/*.hpp"))
+
+env.sources += test_cases_env.sources;
+env.headers += test_cases_env.headers;
+
+objects_static = []
+test_cases_env.add_source_files(objects_static, test_cases_env.sources, shared=False);
+test_cases_env.program = test_cases_env.Program('#bin/tests', [objects_static, env.library_static]);
+
+# Set Alias
+env.Alias('test', test_cases_env.program);
+env.Alias('check', test_cases_env.program);
+
+env.targets += ['test','check'];
diff --git a/modules/codec-unit/tests/codec-unit.cpp b/modules/codec-unit/tests/codec-unit.cpp
new file mode 100644
index 0000000..9fb8012
--- /dev/null
+++ b/modules/codec-unit/tests/codec-unit.cpp
@@ -0,0 +1,14 @@
+#include <forstio/test/suite.hpp>
+
+#include <iostream>
+
+namespace {
+namespace sch {
+using namespace saw::schema;
+}
+
+SAW_TEST("Dummy Test"){
+ using namespace saw;
+ SAW_EXPECT( false, "Dummy" );
+}
+}
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp
index 5eeacbb..bc58937 100644
--- a/modules/codec/c++/transport.hpp
+++ b/modules/codec/c++/transport.hpp
@@ -102,7 +102,7 @@ public:
buffer_view view{out_buff};
uint64_t i = 0u;
for(i = 0u; i < Len && view.write_composite_length() > 0u; ++i){
- view.write() = (value & 0x7F);
+ view.write() = (val & 0x7F);
if( ( val & ~0x7F ) == 0u ){
++i;
@@ -111,7 +111,7 @@ public:
view.write() |= 0x80;
- value = (value >> (i * 7u));
+ val = (val >> (i * 7u));
view.write_advance(1u);
}
diff --git a/modules/remote/c++/remote_loopback.hpp b/modules/remote/c++/remote_loopback.hpp
index 400a076..17f1bfe 100644
--- a/modules/remote/c++/remote_loopback.hpp
+++ b/modules/remote/c++/remote_loopback.hpp
@@ -81,6 +81,8 @@ public:
{}
// error_or<id<>>
+ conveyor<
+ > call
};
}
diff --git a/modules/remote/c++/remote_loopback_base.hpp b/modules/remote/c++/remote_loopback_base.hpp
index 660180d..9b66fa8 100644
--- a/modules/remote/c++/remote_loopback_base.hpp
+++ b/modules/remote/c++/remote_loopback_base.hpp
@@ -12,7 +12,20 @@ struct Loopback {};
template<>
class remote<rmt::Loopback> {
private:
- std::map<uint64_t, ptr<i_data_server<rmt::Loopback>>> registered_data_servers_;
+ struct key_t {
+ std::array<uint64_t,3> data;
+
+ bool operator<(const std::array<uint64_t,3>& rhs) const {
+ for(uint64_t i = 0u; i < 3; ++i){
+ if(data[i] != rhs.data[i]){
+ return data[i] < rhs.data[i];
+ }
+ }
+ return false;
+ }
+ };
+
+ std::map<key_t, ptr<i_data_server<rmt::Loopback>>> registered_data_servers_;
public:
/**
* Resolves an address for the remote
@@ -52,6 +65,15 @@ public:
*/
template<typename Schema, typename Encode>
conveyor<data_client<Schema, Encode, rmt::Loopback>> data_connect(const remote_address<rmt::Loopback>& addr){
+ auto class_id = srv.get_class_id();
+ key_t key;
+ key.data = {addr.get_address_id(), class_id.first, class_id.second};
+
+ auto find = registered_data_servers_.find(key);
+ if(find == registered_data_servers_.end()){
+ return make_error<err::not_found>("Server not found");
+ }
+
}
@@ -60,11 +82,15 @@ public:
*/
error_or<void> register_data_server(const remote_address<rmt::Loopback>& addr, i_data_server<rmt::Loopback>& srv){
- auto insert = registered_data_servers_.emplace(std::make_pair(addr.get_address_id(), {srv}));
+ auto class_id = srv.get_class_id();
+ key_t key;
+ key.data = {addr.get_address_id(), class_id.first, class_id.second};
+ auto insert = registered_data_servers_.emplace(std::make_pair(key, {srv}));
if(insert.second){
return make_error<err::already_exists>("Server already bound to this address");
}
+ return make_void();
}
};
}
diff --git a/modules/remote/c++/transfer_loopback.hpp b/modules/remote/c++/transfer_loopback.hpp
index d205776..55a43fa 100644
--- a/modules/remote/c++/transfer_loopback.hpp
+++ b/modules/remote/c++/transfer_loopback.hpp
@@ -12,14 +12,53 @@ struct Loopback {};
template<>
class remote<rmt::Loopback>;
+template<typename Schema, typename Encoding>
+class data_server<Schema, Encoding, rmt::Loopback> final : public i_data_server<rmt::Loopback> {
+private:
+ //typename
+ using type = std::unordered_map<uint64_t, data<Schema, Encoding>>;
+ type values_;
+
+ ptr<remote<rmt::Loopback>> remote_;
+ remote_address<rmt::Loopback> rmt_address_;
+public:
+ data_server(ptr<remote<rmt::Loopback>> remote__, const remote_address<rmt::Loopback>& addr):
+ remote_{remote__},
+ rmt_address_{addr}
+ {
+ remote_().register_server(addr);
+ }
+
+ ~data_server(){
+ remote_().deregister_server(addr);
+ }
+
+ SAW_FORBID_COPY(data_server);
+ SAW_FORBID_MOVE(data_server);
+
+ /**
+ * Return the schema id
+ */
+ std::pair<uint32_t,uint32_t> get_class_id() const override {
+ uint32_t schema_hash = schema_hash<Schema>::apply();
+ uint32_t encode_hash = schema_hash<Encoding>::apply();
+
+ return std::make_pair(schema_hash, encode_hash);
+ }
+};
+
template<typename... Schema, typename Encoding>
class data_server<tmpl_group<Schema...>, Encoding, rmt::Loopback> final : public i_data_server<rmt::Loopback> {
private:
typename impl::data_server_redux<Encoding, storage::Default, typename tmpl_reduce<tmpl_group<Schema...>>::type>::type values_;
ptr<remote<rmt::Loopback>> remote_;
+ remote_address<rmt::Loopback> rmt_address_;
public:
- data_server(remote_address<rmt::Loopback>& addr){
+ data_server(ptr<remote<rmt::Loopback>> remote__, const remote_address<rmt::Loopback>& addr):
+ remote_{remote__},
+ rmt_address_{addr}
+ {
remote_().register_server(addr);
}