return string("rule") + std::to_string(rule);
}
-void CrushTester::check_overlapped_rules() const
-{
- namespace icl = boost::icl;
- typedef std::set<string> RuleNames;
- typedef icl::interval_map<int, RuleNames> Rules;
- // <ruleset, type> => interval_map<size, {names}>
- typedef std::map<std::pair<int, int>, Rules> RuleSets;
- using interval = icl::interval<int>;
-
- // mimic the logic of crush_find_rule(), but it only return the first matched
- // one, but I am collecting all of them by the overlapped sizes.
- RuleSets rulesets;
- for (int rule = 0; rule < crush.get_max_rules(); rule++) {
- if (!crush.rule_exists(rule)) {
- continue;
- }
- Rules& rules = rulesets[{crush.get_rule_mask_ruleset(rule),
- crush.get_rule_mask_type(rule)}];
- rules += make_pair(interval::closed(crush.get_rule_mask_min_size(rule),
- crush.get_rule_mask_max_size(rule)),
- RuleNames{get_rule_name(crush, rule)});
- }
- for (auto i : rulesets) {
- auto ruleset_type = i.first;
- const Rules& rules = i.second;
- for (auto r : rules) {
- const RuleNames& names = r.second;
- // if there are more than one rules covering the same size range,
- // print them out.
- if (names.size() > 1) {
- err << "overlapped rules in ruleset " << ruleset_type.first << ": "
- << boost::join(names, ", ") << "\n";
- }
- }
- }
-}
-
int CrushTester::test()
{
if (min_rule < 0 || max_rule < 0) {