15void QPageRangesPrivate::mergeIntervals()
17 const int count = intervals.size();
22 std::sort(intervals.begin(), intervals.end());
24 QStack<QPageRanges::Range> stack;
25 stack.push(intervals[0]);
27 for (
int i = 1; i < count; ++i) {
28 QPageRanges::Range &top = stack.top();
30 if (top.to < intervals[i].from - 1)
31 stack.push(intervals[i]);
32 else if (top.to < intervals[i].to)
33 top.to = intervals[i].to;
155QPageRanges QPageRanges::fromString(
const QString &ranges)
157 QList<Range> intervals;
158 const QStringList items = ranges.split(u',');
159 for (
const QString &item : items) {
161 return QPageRanges();
163 if (item.contains(u'-')) {
164 const QStringList rangeItems = item.split(u'-');
165 if (rangeItems.size() != 2)
166 return QPageRanges();
169 const int number1 = rangeItems[0].toInt(&ok);
171 return QPageRanges();
173 const int number2 = rangeItems[1].toInt(&ok);
175 return QPageRanges();
177 if (number1 < 1 || number2 < 1 || number2 < number1)
178 return QPageRanges();
180 intervals.append({number1, number2});
184 const int number = item.toInt(&ok);
186 return QPageRanges();
189 return QPageRanges();
191 intervals.append({number, number});
195 QPageRanges newRanges;
196 newRanges.d.reset(
new QPageRangesPrivate);
197 newRanges.d->intervals = intervals;
198 newRanges.d->mergeIntervals();
205QString QPageRanges::toString()
const
211 for (
const Range &range : d->intervals) {
212 if (!result.isEmpty())
215 if (range.from == range.to)
216 result += QString::number(range.from);
218 result += QStringLiteral(
"%1-%2").arg(range.from).arg(range.to);