4 #ifndef INDET_MODULEIDENTIFIERMATCHUTIL_H
5 #define INDET_MODULEIDENTIFIERMATCHUTIL_H
7 #include "Identifier/Identifier.h"
11 namespace ModuleIdentifierMatchUtil {
13 template <
typename T_ID>
20 return id_helper.side(
id);
29 template <
typename T_ModuleDesign>
31 template <
typename T_ModuleDesign>
34 template <
typename T_ModuleDesign>
39 template <ModuleDesignConcept T_ModuleDesign>
41 if constexpr(HasColumns<T_ModuleDesign>) {
42 return moduleDesign.columns();
45 return moduleDesign.cells();
80 template <
bool test_order,
typename T>
81 inline bool verifyElementCountAndOrder(
const std::vector<std::vector<T> > &arr, std::size_t n_expected, [[maybe_unused]] std::size_t test_n=0) {
82 for (
const auto &sub_arr : arr) {
83 if (sub_arr.size() != n_expected)
return false;
84 if (test_n%2 != 0 || test_n>=n_expected)
return false;
85 if constexpr(test_order) {
86 for (
unsigned int i=0;
i<test_n;
i+=2) {
87 if (sub_arr.at(
i)>sub_arr.at(
i+1))
return false;
106 template <
typename T>
108 return verifyElementCountAndOrder<false,T>(arr,n_expected, 0);
117 assert(
part%2==0 &&
static_cast<unsigned int>(
part/2)<
dest.size());
128 template <
class T_ID,
class T_ModuleDesign>
131 const T_ModuleDesign &module_design,
150 inline void moduleMatches(
const std::vector<std::vector<int> > &module_pattern,
152 std::vector<unsigned int> &module_pattern_idx) {
153 module_pattern_idx.clear();
154 for (
unsigned int pattern_i=0
u; pattern_i<module_pattern.size(); ++pattern_i) {
155 const std::vector<int> &
pattern = module_pattern[pattern_i];
156 unsigned int range_i=0;
158 for (
int module_value : module_data) {
159 assert( range_i+1 <
pattern.size());
160 if (module_value<
pattern[range_i] || module_value>
pattern[range_i+1]) {
167 module_pattern_idx.push_back(pattern_i);