From 5c65123b44cd8e9761ff8c812b141a496a649019 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Fri, 11 Apr 2025 12:54:00 +0200 Subject: Moving towards more forstio data types --- modules/codec/c++/data.hpp | 30 ++++++++++++++++++++++-------- modules/codec/c++/simple.hpp | 24 +++++++++++++----------- modules/codec/tests/transport.cpp | 16 ++++++++-------- 3 files changed, 43 insertions(+), 27 deletions(-) (limited to 'modules/codec') diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp index 9f65d08..ce57967 100644 --- a/modules/codec/c++/data.hpp +++ b/modules/codec/c++/data.hpp @@ -319,14 +319,6 @@ public: value_{value__} {} - constexpr data& at(const std::array& ind){ - return value_.at(this->get_flat_index(ind)); - } - - constexpr const data& at(const std::array& ind) const { - return value_.at(this->get_flat_index(ind)); - } - constexpr data& at(data i) { return value_.at(this->get_flat_index({i.get()})); } @@ -861,5 +853,27 @@ public: } }; +/** + * I need some basic support to be able to have some STL guarantees for now. + * I probably should to a trait check on the encoding to have some guarantees regarding the layout instead. + */ +template +struct convert_to_stl { + static_assert(always_false, "Encode or Schema not supported for stl conversion"); +}; + +template +struct convert_to_stl, encode::Native> { + using Schema = schema::FixedArray; + static_assert(is_primitive::value, "Only supports primitives"); + + std::array::type, Dim> operator()(const data& inp){ + std::array::type,Dim> conv; + for(uint64_t i = 0u; i < Dim; ++i){ + conv[i] = inp.at({i}).get(); + } + return conv; + } +}; } diff --git a/modules/codec/c++/simple.hpp b/modules/codec/c++/simple.hpp index de35c3e..0e5ef6d 100644 --- a/modules/codec/c++/simple.hpp +++ b/modules/codec/c++/simple.hpp @@ -48,12 +48,12 @@ struct kelsimple_encode, FromEnc> { template struct kelsimple_encode, FromEnc> { template - static error_or encode_level(const data, FromEnc>& from, buffer& to, std::array& index){ + static error_or encode_level(const data, FromEnc>& from, buffer& to, data, FromEnc>& index){ if constexpr (Dim == Level){ return kelsimple_encode::encode(from.at(index), to); } else { const std::size_t dim_size = from.get_dim_size(Level); - for(index[Level] = 0; (index.at(Level) < dim_size); ++index[Level]){ + for(index.at(Level) = 0; (index.at(Level).get() < dim_size); ++index.at(Level)){ auto eov = encode_level(from, to, index); if(eov.is_error()){ return eov; @@ -73,8 +73,10 @@ struct kelsimple_encode, FromEnc> { } } { - std::array index; - std::fill(index.begin(), index.end(), 0); + data,FromEnc> index; + for(data i{0u}; i.get() < Dim; ++i){ + index.at(i) = 0u; + } return encode_level<0>(from, to, index); } @@ -210,12 +212,12 @@ struct kelsimple_decode, FromEnc> { template struct kelsimple_decode, FromEnc> { template - static error_or decode_level(buffer& from, data, FromEnc>& to, std::array& index){ + static error_or decode_level(buffer& from, data, FromEnc>& to, data, FromEnc>& index){ if constexpr (Level == Dim){ - return kelsimple_decode::decode(from, {to.at(index)}); + return kelsimple_decode::decode(from, to.at(index)); }else{ - const std::size_t dim_size = to.get_dim_size(Level); - for(index[Level] = 0; index[Level] < dim_size; ++index[Level]){ + const auto dim_size = to.get_dim_size(Level); + for(index.at(Level) = 0; index.at(Level).get() < dim_size; ++index.at(Level)){ auto eov = decode_level(from, to, index); if(eov.is_error()){ return eov; @@ -227,19 +229,19 @@ struct kelsimple_decode, FromEnc> { static error_or decode(buffer& from, data, FromEnc>& to){ { - std::array dims{}; + data, FromEnc> dims{}; for(std::size_t i = 0; i < Dim; ++i){ uint64_t val{}; auto eov = stream_value::decode(val, from); if(eov.is_error()){ return eov; } - dims.at(i) = static_cast(val); + dims.at({i}) = {static_cast(val)}; } to = data,FromEnc>{dims}; } { - std::array index{}; + data, FromEnc> index{}; return decode_level<0>(from, to, index); } return void_t{}; diff --git a/modules/codec/tests/transport.cpp b/modules/codec/tests/transport.cpp index e0e105f..515092c 100644 --- a/modules/codec/tests/transport.cpp +++ b/modules/codec/tests/transport.cpp @@ -33,8 +33,8 @@ SAW_TEST("Transport FixedLen Struct write and slice"){ auto& tda = native.template get<"two_dim_array">(); tda = {1,2}; - tda.at({0,0}).set(5); - tda.at({0,1}).set(3); + tda.at({{0,0}}).set(5); + tda.at({{0,1}}).set(3); native.template get<"number">().set(410); } codec codec; @@ -67,8 +67,8 @@ SAW_TEST("Transport FixedLen Struct write and slice"){ auto& tda = native.template get<"two_dim_array">(); tda = {1,2}; - tda.at({0,0}).set(2); - tda.at({0,1}).set(4); + tda.at({{0,0}}).set(2); + tda.at({{0,1}}).set(4); native.template get<"number">().set(709); } { @@ -118,8 +118,8 @@ SAW_TEST("Transport FixedLen Struct write and slice"){ { auto& tda = native.template get<"two_dim_array">(); - SAW_EXPECT(tda.at({0,0}).get() == 5, "Decoded value (0,0) wrong."); - SAW_EXPECT(tda.at({0,1}).get() == 3, "Decoded value (0,1) wrong."); + SAW_EXPECT(tda.at({{0,0}}).get() == 5, "Decoded value (0,0) wrong."); + SAW_EXPECT(tda.at({{0,1}}).get() == 3, "Decoded value (0,1) wrong."); SAW_EXPECT(native.template get<"number">().get() == 410, "Decoded value number wrong."); } } @@ -148,8 +148,8 @@ SAW_TEST("Transport FixedLen Struct write and slice"){ { auto& tda = native.template get<"two_dim_array">(); - SAW_EXPECT(tda.at({0,0}).get() == 2, "Decoded value (0,0) wrong."); - SAW_EXPECT(tda.at({0,1}).get() == 4, "Decoded value (0,1) wrong."); + SAW_EXPECT(tda.at({{0,0}}).get() == 2, "Decoded value (0,0) wrong."); + SAW_EXPECT(tda.at({{0,1}}).get() == 4, "Decoded value (0,1) wrong."); SAW_EXPECT(native.template get<"number">().get() == 709, "Decoded value number wrong."); } } -- cgit v1.2.3