summaryrefslogtreecommitdiff
path: root/modules/codec/c++/data.hpp
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-04-09 14:47:40 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-04-09 14:47:40 +0200
commit6e5178260017e492921090aea95f0120d9f5e66d (patch)
tree6d25b46cda514a0c74c50fd374243cabf40c05a8 /modules/codec/c++/data.hpp
parent3e10a47c7329033cfc4eaea19418b57ae83481a9 (diff)
codec: Fixed some fixedArray issues
Diffstat (limited to 'modules/codec/c++/data.hpp')
-rw-r--r--modules/codec/c++/data.hpp128
1 files changed, 71 insertions, 57 deletions
diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp
index 2cf2a96..5ad4e3f 100644
--- a/modules/codec/c++/data.hpp
+++ b/modules/codec/c++/data.hpp
@@ -82,6 +82,53 @@ private:
static_assert(always_false<T>, "Type not supported");
};
+template<typename T, size_t N>
+class data<schema::Primitive<T,N>, encode::Native> {
+private:
+ typename native_data_type<schema::Primitive<T,N>>::type value_;
+public:
+ data():value_{}{}
+
+ SAW_DEFAULT_COPY(data);
+ SAW_DEFAULT_MOVE(data);
+
+ data(typename native_data_type<schema::Primitive<T,N>>::type value__):
+ value_{std::move(value__)}{}
+
+ void set(typename native_data_type<schema::Primitive<T,N>>::type val){
+ value_ = val;
+ }
+
+ typename native_data_type<schema::Primitive<T,N>>::type get() const {return value_;}
+
+ data<schema::Primitive<T,N>, encode::Native> operator*(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
+ return {get() * rhs.get()};
+ }
+
+ data<schema::Primitive<T,N>, encode::Native> operator/(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
+ return {get() / rhs.get()};
+ }
+
+ data<schema::Primitive<T,N>, encode::Native> operator+(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
+ return {get() + rhs.get()};
+ }
+
+ data<schema::Primitive<T,N>, encode::Native> operator-(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
+ return {get() - rhs.get()};
+ }
+
+ template<typename Enc>
+ bool operator==(const data<schema::Primitive<T,N>, Enc>& rhs)const{
+ return get() == rhs.get();
+ }
+
+ template<typename Enc>
+ bool operator<(const data<schema::Primitive<T,N>, Enc>& rhs) const {
+ return get() < rhs.get();
+ }
+};
+
+
template<typename... T, string_literal... literals>
class data<schema::Union<schema::Member<T, literals>...>, encode::Native> {
private:
@@ -182,6 +229,7 @@ public:
template<typename T, size_t Dim>
class data<schema::Array<T,Dim>, encode::Native> {
private:
+ // data<schema::FixedArray<schema::UInt64, Dim>> dims_;
std::array<uint64_t, Dim> dims_;
std::vector<data<T, encode::Native>> value_;
@@ -250,22 +298,22 @@ class data<schema::Array<T,Dim>, encode::Native> {
static_assert(sizeof...(Dims)==Dim, "Argument size must be equal to the Dimension");
}
- data<T, encode::Native>& at(const std::array<std::size_t, Dim>& ind){
+ data<T, encode::Native>& at(const std::array<uint64_t, Dim>& ind){
return value_.at(this->get_flat_index(ind));
}
- const data<T, encode::Native>& at(const std::array<std::size_t, Dim>& ind) const {
+ const data<T, encode::Native>& at(const std::array<uint64_t, Dim>& ind) const {
return value_.at(this->get_flat_index(ind));
}
template<std::integral... Dims>
data<T, encode::Native>& at(Dims... i){
- return value_.at(this->get_flat_index({static_cast<uint64_t>(i)...}));
+ return value_.at(this->get_flat_index(std::array<uint64_t, Dim>{static_cast<uint64_t>(i)...}));
}
template<std::integral... Dims>
const data<T, encode::Native>& at(Dims... i) const {
- return value_.at(this->get_flat_index({static_cast<uint64_t>(i)...}));
+ return value_.at(this->get_flat_index(std::array<uint64_t, Dim>{static_cast<uint64_t>(i)...}));
}
data<T,encode::Native>& at(const data<schema::FixedArray<schema::UInt64,Dim>>& i){
@@ -287,19 +335,31 @@ class data<schema::Array<T,Dim>, encode::Native> {
}
private:
- uint64_t get_flat_index(const std::array<uint64_t, Dim>& i) const {
- return get_flat_index(data<schema::FixedArray<schema::UInt64,Dim>>{i});
- }
-
- uint64_t get_flat_index(const data<schema::FixedArray<schema::UInt64,Dim>>& i) const {
+ template<typename U>
+ uint64_t get_flat_index(const U& i) const {
+ static_assert(
+ std::is_same_v<U,data<schema::FixedArray<schema::UInt64,Dim>>> or
+ std::is_same_v<U,std::array<uint64_t,Dim>>,
+ "Unsupported type"
+ );
assert(value_.size() == get_full_size());
uint64_t s = 0;
uint64_t stride = 1;
for(uint64_t iter = 0; iter < Dim; ++iter){
- assert(i.at(iter).get() < dims_.at(iter));
- s += i.at(iter).get() * stride;
+ uint64_t ind = [](auto val) -> uint64_t {
+ using V = std::decay_t<decltype(val)>;
+ if constexpr (std::is_same_v<V,data<schema::UInt64>>){
+ return val.get();
+ }else if constexpr (std::is_same_v<V, uint64_t>){
+ return val;
+ }else{
+ static_assert(always_false<V>, "Cases exhausted");
+ }
+ }(i.at(iter));
+ assert(ind < dims_.at(iter));
+ s += ind * stride;
stride *= dims_.at(iter);
}
@@ -413,51 +473,5 @@ public:
}
};
-template<typename T, size_t N>
-class data<schema::Primitive<T,N>, encode::Native> {
-private:
- typename native_data_type<schema::Primitive<T,N>>::type value_;
-public:
- data():value_{}{}
-
- SAW_DEFAULT_COPY(data);
- SAW_DEFAULT_MOVE(data);
-
- data(typename native_data_type<schema::Primitive<T,N>>::type value__):
- value_{std::move(value__)}{}
-
- void set(typename native_data_type<schema::Primitive<T,N>>::type val){
- value_ = val;
- }
-
- typename native_data_type<schema::Primitive<T,N>>::type get() const {return value_;}
-
- data<schema::Primitive<T,N>, encode::Native> operator*(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
- return {get() * rhs.get()};
- }
-
- data<schema::Primitive<T,N>, encode::Native> operator/(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
- return {get() / rhs.get()};
- }
-
- data<schema::Primitive<T,N>, encode::Native> operator+(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
- return {get() + rhs.get()};
- }
-
- data<schema::Primitive<T,N>, encode::Native> operator-(const data<schema::Primitive<T,N>, encode::Native>& rhs)const{
- return {get() - rhs.get()};
- }
-
- template<typename Enc>
- bool operator==(const data<schema::Primitive<T,N>, Enc>& rhs)const{
- return get() == rhs.get();
- }
-
- template<typename Enc>
- bool operator<(const data<schema::Primitive<T,N>, Enc>& rhs) const {
- return get() < rhs.get();
- }
-};
-
}