| 174 | } |
| 175 | |
| 176 | std::vector<osmoh::RuleSequence> OpeningHoursSerDes::DecomposeOh(osmoh::OpeningHours const & oh) |
| 177 | { |
| 178 | auto const apply = [&](auto & rules, auto const & ranges, auto const & rangeSetter) |
| 179 | { |
| 180 | if (ranges.empty()) |
| 181 | return; |
| 182 | |
| 183 | std::vector<osmoh::RuleSequence> originalRules = std::move(rules); |
| 184 | if (originalRules.empty()) |
| 185 | originalRules.emplace_back(); |
| 186 | |
| 187 | rules.clear(); |
| 188 | for (auto const & range : ranges) |
| 189 | { |
| 190 | auto const toDo = [&range, &rangeSetter](auto & rule) { rangeSetter(range, rule); }; |
| 191 | for (auto const & originalRule : originalRules) |
| 192 | { |
| 193 | auto rule = originalRule; |
| 194 | toDo(rule); |
| 195 | rules.emplace_back(std::move(rule)); |
| 196 | } |
| 197 | } |
| 198 | }; |
| 199 | |
| 200 | std::vector<osmoh::RuleSequence> finalRules; |
| 201 | for (auto const & rule : oh.GetRule()) |
| 202 | { |
| 203 | std::vector<osmoh::RuleSequence> rules; |
| 204 | |
| 205 | if (rule.IsTwentyFourHours()) |
| 206 | { |
| 207 | static auto const kTwentyFourHourRule = GetTwentyFourHourRule(); |
| 208 | finalRules.emplace_back(kTwentyFourHourRule); |
| 209 | break; |
| 210 | } |
| 211 | |
| 212 | // Ir rule has just modifier (opening hours: "closed") it is empty but has a useful modifier. |
| 213 | if (rule.IsEmpty() && UselessModifier(rule)) |
| 214 | continue; |
| 215 | |
| 216 | bool badRule = false; |
| 217 | apply(rules, rule.GetYears(), [&](osmoh::YearRange const & range, osmoh::RuleSequence & item) |
| 218 | { |
| 219 | if (ShouldSkipYear(range, m_currentYear)) |
| 220 | badRule = true; |
| 221 | |
| 222 | item.SetYears({range}); |
| 223 | }); |
| 224 | |
| 225 | apply(rules, rule.GetMonths(), [&](osmoh::MonthdayRange const & range, osmoh::RuleSequence & item) |
| 226 | { |
| 227 | if (ShouldSkipYear(range, m_currentYear)) |
| 228 | badRule = true; |
| 229 | |
| 230 | item.SetMonths({range}); |
| 231 | }); |
| 232 | |
| 233 | if (badRule) |
nothing calls this directly
no test coverage detected