16void QPageRangesPrivate::mergeIntervals()
18 const int count = intervals.size();
23 std::sort(intervals.begin(), intervals.end());
25 QStack<QPageRanges::Range> stack;
26 stack.push(intervals[0]);
28 for (
int i = 1; i < count; ++i) {
29 QPageRanges::Range &top = stack.top();
31 if (top.to < intervals[i].from - 1)
32 stack.push(intervals[i]);
33 else if (top.to < intervals[i].to)
34 top.to = intervals[i].to;
156QPageRanges QPageRanges::fromString(
const QString &ranges)
158 QList<Range> intervals;
159 const QStringList items = ranges.split(u',');
160 for (
const QString &item : items) {
162 return QPageRanges();
164 if (item.contains(u'-')) {
165 const QStringList rangeItems = item.split(u'-');
166 if (rangeItems.size() != 2)
167 return QPageRanges();
170 const int number1 = rangeItems[0].toInt(&ok);
172 return QPageRanges();
174 const int number2 = rangeItems[1].toInt(&ok);
176 return QPageRanges();
178 if (number1 < 1 || number2 < 1 || number2 < number1)
179 return QPageRanges();
181 intervals.append({number1, number2});
185 const int number = item.toInt(&ok);
187 return QPageRanges();
190 return QPageRanges();
192 intervals.append({number, number});
196 QPageRanges newRanges;
197 newRanges.d.reset(
new QPageRangesPrivate);
198 newRanges.d->intervals = intervals;
199 newRanges.d->mergeIntervals();
206QString QPageRanges::toString()
const
212 for (
const Range &range : d->intervals) {
213 if (!result.isEmpty())
216 if (range.from == range.to)
217 result += QString::number(range.from);
219 result += QStringLiteral(
"%1-%2").arg(range.from).arg(range.to);