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-json/c++/json.tmpl.hpp | 31 ++++++++++++++--------------- modules/codec-json/tests/codec-json.cpp | 16 +++++++-------- modules/codec-netcdf/c++/netcdf.tmpl.hpp | 14 +++++++------ modules/codec-netcdf/tests/codec-netcdf.cpp | 2 +- modules/codec/c++/data.hpp | 30 ++++++++++++++++++++-------- modules/codec/c++/simple.hpp | 24 ++++++++++++---------- modules/codec/tests/transport.cpp | 16 +++++++-------- 7 files changed, 75 insertions(+), 58 deletions(-) (limited to 'modules') diff --git a/modules/codec-json/c++/json.tmpl.hpp b/modules/codec-json/c++/json.tmpl.hpp index 1eb46bc..e51d456 100644 --- a/modules/codec-json/c++/json.tmpl.hpp +++ b/modules/codec-json/c++/json.tmpl.hpp @@ -199,7 +199,7 @@ struct json_encode, FromEncode> { using Schema = schema::Array; template - static error_or encode_level(const data& from, buffer& to, std::array& index, uint64_t depth, bool pretty){ + static error_or encode_level(const data& from, buffer& to, data, FromEncode>& index, uint64_t depth, bool pretty){ if constexpr (Level == D){ if(pretty){ auto eov = json_helper::print_pretty_indent(to, depth); @@ -232,7 +232,7 @@ struct json_encode, FromEncode> { } } { - index[Level] = i; + index.at(Level) = i; auto eov = encode_level(from, to, index, depth+1u, pretty); if(eov.is_error()){ return eov; @@ -256,7 +256,7 @@ struct json_encode, FromEncode> { } static error_or encode(const data& from, buffer& to, uint64_t depth, bool pretty) { - std::array index; + data, FromEncode> index; return encode_level<0>(from, to, index, depth+1u, pretty); } }; @@ -289,7 +289,7 @@ struct json_encode, FromEncode> { } } { - index[Level] = i; + index.at(Level) = i; if constexpr (sizeof...(DimPack) > 0){ auto eov = encode_level(from, to, index, depth, pretty); if(eov.is_error()){ @@ -837,7 +837,7 @@ struct json_decode, ToDecode> { using Schema = schema::Array; template - static error_or decode_flat_level(buffer_view& buff, std::vector>& to, std::array& index, std::array& dims, bool log_dim){ + static error_or decode_flat_level(buffer_view& buff, std::vector>& to, data, ToDecode>& index, data, ToDecode>& dims, bool log_dim){ if constexpr (Level == D) { json_helper::skip_whitespace(buff); @@ -867,10 +867,10 @@ struct json_decode, ToDecode> { is_empty = true; } - index[Level] = 0; + index.at(Level) = 0; for(;!is_empty;){ // We should have an element right now - auto eov = decode_flat_level(buff,to,index,dims, index[Level] == 0 && log_dim); + auto eov = decode_flat_level(buff,to,index,dims, index.at(Level).get() == 0 && log_dim); if(eov.is_error()){ return eov; } @@ -879,7 +879,7 @@ struct json_decode, ToDecode> { return make_error(); } - ++index[Level]; + ++index.at(Level); if(buff.read() == ','){ buff.read_advance(1); } else if(buff.read() == ']'){ @@ -894,8 +894,8 @@ struct json_decode, ToDecode> { } } if(log_dim){ - dims[Level] = index[Level]; - }else if (dims[Level] != index[Level]){ + dims.at(Level) = index.at(Level); + }else if (dims.at(Level) != index.at(Level)){ return make_error("Not matching Array endings"); } } @@ -903,14 +903,14 @@ struct json_decode, ToDecode> { } template - static error_or decode_unflat_level(std::vector>& flat, data, ToDecode>& to, std::array& index, std::size_t& flat_index) { + static error_or decode_unflat_level(std::vector>& flat, data, ToDecode>& to, data, ToDecode>& index, std::size_t& flat_index) { if constexpr ( Level == D ){ - auto& flat_data = flat.at(flat_index); + auto& flat_data = flat.at({flat_index}); to.at(index) = std::move(flat_data); ++flat_index; }else { const std::size_t dim_size = to.get_dim_size(Level); - for(index[Level] = 0; index[Level] < dim_size; ++index[Level]){ + for(index.at(Level) = 0; index.at(Level).get() < dim_size; ++index.at(Level)){ auto eov = decode_unflat_level(flat, to, index, flat_index); if(eov.is_error()){ @@ -922,9 +922,8 @@ struct json_decode, ToDecode> { } static error_or decode(buffer_view& buff, data& to){ - std::array index; - std::array dims; - std::fill(dims.begin(), dims.end(), 0); + data, ToDecode> index; + data, ToDecode> dims; std::vector> flat_array; auto eov = decode_flat_level<0>(buff, flat_array, index, dims, true); if(eov.is_error()){ diff --git a/modules/codec-json/tests/codec-json.cpp b/modules/codec-json/tests/codec-json.cpp index a181dc0..c5f08ec 100644 --- a/modules/codec-json/tests/codec-json.cpp +++ b/modules/codec-json/tests/codec-json.cpp @@ -273,10 +273,10 @@ SAW_TEST("Three Dim Array write and read"){ data native{2,1,2}; data json; - native.at({0,0,0}).set("multi"); - native.at({0,0,1}).set("baz"); - native.at({1,0,0}).set("foo"); - native.at({1,0,1}).set("bar"); + native.at({{0,0,0}}).set("multi"); + native.at({{0,0,1}}).set("baz"); + native.at({{1,0,0}}).set("foo"); + native.at({{1,0,1}}).set("bar"); codec codec; @@ -291,10 +291,10 @@ SAW_TEST("Three Dim Array write and read"){ native = {}; eov = codec.decode(json, native); SAW_EXPECT(eov.is_value(), "Decoding error"); - SAW_EXPECT(native.at({0,0,0}) == "multi", "Invalid Value at 0,0,0"); - SAW_EXPECT(native.at({0,0,1}) == "baz", "Invalid Value at 0,0,1"); - SAW_EXPECT(native.at({1,0,0}) == "foo", "Invalid Value at 1,0,0"); - SAW_EXPECT(native.at({1,0,1}) == "bar", "Invalid Value at 1,0,1"); + SAW_EXPECT(native.at({{0,0,0}}) == "multi", "Invalid Value at 0,0,0"); + SAW_EXPECT(native.at({{0,0,1}}) == "baz", "Invalid Value at 0,0,1"); + SAW_EXPECT(native.at({{1,0,0}}) == "foo", "Invalid Value at 1,0,0"); + SAW_EXPECT(native.at({{1,0,1}}) == "bar", "Invalid Value at 1,0,1"); } diff --git a/modules/codec-netcdf/c++/netcdf.tmpl.hpp b/modules/codec-netcdf/c++/netcdf.tmpl.hpp index bf257e4..ba357a5 100644 --- a/modules/codec-netcdf/c++/netcdf.tmpl.hpp +++ b/modules/codec-netcdf/c++/netcdf.tmpl.hpp @@ -229,18 +229,18 @@ struct netcdf_decode, ToDecode> { using Schema = schema::Array; template - static error_or decode_level(data& to, int from, int nc_varid, std::array& index, const std::array& count){ + static error_or decode_level(data& to, int from, int nc_varid, data, ToDecode>& index, const std::array& count){ if constexpr ( Level == Dim ){ int rc{}; typename native_data_type::type val; - rc = nc_get_vara(from, nc_varid, index.data(), count.data(), &val); + rc = nc_get_vara(from, nc_varid, convert_to_stl, ToDecode>{}(index).data(), count.data(), &val); if(rc != NC_NOERR){ return make_error(); } to.at(index).set(val); }else{ const std::size_t dim_size = to.get_dim_size(Level); - for(index[Level] = 0; index[Level] < dim_size; ++index[Level]){ + for(index.at(Level) = 0; index.at(Level).get() < dim_size; ++index.at(Level)){ auto eov = decode_level(to, from, nc_varid, index, count); if(eov.is_error()){ return eov; @@ -270,18 +270,20 @@ struct netcdf_decode, ToDecode> { return make_error(); } - std::array dims; + data, ToDecode> dims; std::array count; for(std::size_t i = 0; i < Dim; ++i){ - rc = nc_inq_dim(from, nc_dimids[i], nullptr, &dims[i]); + uint64_t dim_i = dims.at({i}).get(); + rc = nc_inq_dim(from, nc_dimids[i], nullptr, &dim_i); if(rc != NC_NOERR){ return make_error(); } + dims.at(i).set(dim_i); count[i] = 1; } to = {dims}; - std::array index; + data, ToDecode> index; return decode_level<0>(to, from, nc_varid, index, count); } diff --git a/modules/codec-netcdf/tests/codec-netcdf.cpp b/modules/codec-netcdf/tests/codec-netcdf.cpp index 540f60e..6595851 100644 --- a/modules/codec-netcdf/tests/codec-netcdf.cpp +++ b/modules/codec-netcdf/tests/codec-netcdf.cpp @@ -97,7 +97,7 @@ SAW_TEST("NetCDF Struct Array read"){ for(std::size_t i = 0; i < 5; ++i){ for(std::size_t j = 0; j < 3; ++j){ int64_t exp_val = i * 3 + j; - SAW_EXPECT(arr.at({i,j}).get() == exp_val, "Incorrect value"); + SAW_EXPECT(arr.at({{i,j}}).get() == exp_val, "Incorrect value"); } } } 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