summaryrefslogtreecommitdiff
path: root/lib/c++/iterator.hpp
blob: 866543ad6f6f92fe419dcbac71c9b77b4f0d2348 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#pragma once

#include "descriptor.hpp"

namespace kel {
namespace lbm {
template<typename Func>
void iterate_over(Func&& func, const saw::data<sch::FixedArray<sch::UInt64,2u>>& start, const saw::data<sch::FixedArray<sch::UInt64,2u>>& end, const saw::data<sch::FixedArray<sch::UInt64,2u>>& dist = {{{0u,0u}}}){
	// static_assert(D == 2u, "Currently a lazy implementation for AND combinations of intervalls.");
	for(saw::data<sch::UInt64> i{start.at({0u}) + dist.at({0u})}; (i+dist.at({0u})) < end.at({0u}); ++i){
		for(saw::data<sch::UInt64> j{start.at({1u}) + dist.at({1u})}; (j+dist.at({1u})) < end.at({1u}); ++j){
			func({{i,j}});
		}
	}
	return;
}

/**
 *
 */
template<uint64_t D>
struct iterator {
private:
	template<uint64_t i, typename Func>
	static void iterate_over_i(Func& func,
		const saw::data<sch::FixedArray<sch::UInt64,D>>& start,
		const saw::data<sch::FixedArray<sch::UInt64,D>>& end,
		const saw::data<sch::FixedArray<sch::UInt64,D>>& dist,
		saw::data<sch::FixedArray<sch::UInt64,D>>& iter
	){
		static_assert(i <= D, "Eh. Too tired to think of a good message");
		if constexpr ( i == D ){
			func(iter);
		}else{
			for(iter.at({i}) = start.at({i})+dist.at({i}); (iter.at({i})+dist.at({i}) < end.at({i})); ++iter.at({i})){
				iterate_over_i<i+1u,Func>(func,start,end,dist,iter);
			}
		}
	}
public:
	template<typename Func>
	static void apply(
		Func&& func,
		const saw::data<sch::FixedArray<sch::UInt64,D>>& start,
		const saw::data<sch::FixedArray<sch::UInt64,D>>& end,
		const saw::data<sch::FixedArray<sch::UInt64,D>>& dist = {}
	){
		saw::data<sch::FixedArray<sch::UInt64,D>> iter;
		iterate_over_i<0u,Func>(func, start, end, dist, iter);
	}
};

/* Ambiguous
template<typename Func>
void iterate_over(Func&& func, const saw::data<sch::FixedArray<sch::UInt64,3u>>& start, const saw::data<sch::FixedArray<sch::UInt64,3u>>& end, const saw::data<sch::FixedArray<sch::UInt64,3u>>& dist = {{{0u,0u,0u}}}){
	// static_assert(D == 2u, "Currently a lazy implementation for AND combinations of intervalls.");
	for(saw::data<sch::UInt64> i{start.at({0u}) + dist.at({0u})}; (i+dist.at({0u})) < end.at({0u}); ++i){
		for(saw::data<sch::UInt64> j{start.at({1u}) + dist.at({1u})}; (j+dist.at({1u})) < end.at({1u}); ++j){
			for(saw::data<sch::UInt64> k{start.at({2u}) + dist.at({2u})}; (j+dist.at({2u})) < end.at({2u}); ++j){
				func({{k,j,i}});
			}
		}
	}
	return;
}
*/
}
}