diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-08-06 18:37:49 +0200 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-08-06 18:37:49 +0200 |
commit | 16ea7cfc4d834a3c0cedb4a833ff0f212eeee2dc (patch) | |
tree | 1e20f18e1c984d96ef351cb4f6bd5dff81641f89 /modules/codec/c++/iterator.hpp | |
parent | de03ab009d6f7a5e10d3bfd5dd3d4ad1672b1ace (diff) |
Fixing math operators
Diffstat (limited to 'modules/codec/c++/iterator.hpp')
-rw-r--r-- | modules/codec/c++/iterator.hpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/modules/codec/c++/iterator.hpp b/modules/codec/c++/iterator.hpp new file mode 100644 index 0000000..96a4441 --- /dev/null +++ b/modules/codec/c++/iterator.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include "data.hpp" + +namespace saw { +namespace impl { +template<uint64_t i, uint64_t val_0, uint64_t... vals> +struct iterator_index_parameter_value { + static_assert(i > 0, "Shouldn't happen"); + static constexpr uint64_t value = iterator_index_parameter_value<i-1u, vals...>::value; +}; + +template<uint64_t val_0, uint64_t... vals> +struct iterator_index_parameter_value<0u, val_0, vals...> { + static constexpr uint64_t value = val_0; +}; + +template<typename Func, uint64_t... Dims> +struct iterator_in_bounds { +private: + static constexpr std::array<uint64_t, sizeof...(Dims)> dims_{Dims...}; + + template<uint64_t level> + static error_or<void> apply_i(Func& func, data<schema::FixedArray<schema::UInt64, sizeof...(Dims)>, encode::Native>& index){ + if constexpr (level >= sizeof...(Dims)){ + return func(index); + }else{ + index.at({level}).set(0); + + for(;index.at({level}) < impl::iterator_index_parameter_value<level,Dims...>::value; ++index.at({level})){ + auto eov = apply_i<level+1u>(func, index); + if(eov.is_error()){ + return eov; + } + } + } + return saw::make_void(); + } +public: + static error_or<void> apply(Func& func){ + data<schema::FixedArray<schema::UInt64,sizeof...(Dims)>, encode::Native> index; + return apply_i<0u>(func, index); + } +}; +} + +template<uint64_t... Dims> +struct rank_iterator { + template<typename Func> + static error_or<void> in_fixed_bounds(Func&& func){ + // static_assert(D == 2u, "Currently a lazy implementation for AND combinations of intervalls."); + return impl::iterator_in_bounds<Func,Dims...>::apply(func); + } +}; +} |