void RangeListTest::testConstructors() { RangeList ranges; QVERIFY(ranges.isEmpty() && ranges.rangesCount() == 0); ranges << Range(1, 2); QVERIFY(ranges.firstIndex() == 1 && ranges.lastIndex() == 2 && ranges.indexesCount() == 2); RangeList ranges2(Range(1, 2)); QVERIFY(ranges == ranges2); ranges2 = ranges; QVERIFY(ranges == ranges2); ranges << Range(7, 9); QVERIFY(ranges.firstIndex() == 1 && ranges.lastIndex() == 9 && ranges.indexesCount() == 5); RangeList ranges3(ranges); QVERIFY(ranges == ranges3); ranges3 = ranges; QVERIFY(ranges == ranges3); RangeList complementRanges = ranges.complement(); QVERIFY(complementRanges.firstIndex() == 0); QVERIFY(complementRanges.lastIndex() == Range::MaxIndex); RangeList::ConstIterator complementRangesIt = complementRanges.begin(); QVERIFY(*(complementRangesIt++) == Range(0, 0)); QVERIFY(*(complementRangesIt++) == Range(3, 6)); QVERIFY(*(complementRangesIt++) == Range(10, Range::MaxIndex)); }
void serializeRanges(const RangeList &list, std::string &out) { std::ostringstream outs; for (RangeList::const_iterator liter = list.begin(); liter != list.end(); ++liter) { cache_ssize_type len = (cache_ssize_type)((*liter).length()); if ((*liter).goesToEndOfFile()) { len = -len; } outs << (*liter).startbyte() << " " << len << "; "; } out = outs.str(); }
inline bool contains(CallNo callNo, CallFlags callFlags = FREQUENCY_ALL) const { if (empty()) { return false; } RangeList::const_iterator it; for (it = ranges.begin(); it != ranges.end() && it->start <= callNo; ++it) { if (it->contains(callNo, callFlags)) { return true; } } return false; }
void Subtitle::joinLines(const RangeList &ranges) { beginCompositeAction(i18n("Join Lines")); RangeList obsoletedRanges; for(RangeList::ConstIterator rangesIt = ranges.begin(), end = ranges.end(); rangesIt != end; ++rangesIt) { int rangeStart = (*rangesIt).start(); int rangeEnd = normalizeRangeIndex((*rangesIt).end()); if(rangeStart >= rangeEnd) continue; SubtitleLine *firstLine = m_lines.at(rangeStart); SubtitleLine *lastLine = m_lines.at(rangeEnd); SString primaryText, secondaryText; for(SubtitleIterator it(*this, Range(rangeStart, rangeEnd - 1)); it.current(); ++it) { if(!it.current()->primaryText().isEmpty()) { primaryText.append(it.current()->primaryText()); primaryText.append("\n"); } if(!it.current()->secondaryText().isEmpty()) { secondaryText.append(it.current()->secondaryText()); secondaryText.append("\n"); } } primaryText.append(lastLine->primaryText()); secondaryText.append(lastLine->secondaryText()); firstLine->setTexts(primaryText, secondaryText); firstLine->setHideTime(lastLine->hideTime()); obsoletedRanges << Range(rangeStart + 1, rangeEnd); } removeLines(obsoletedRanges, Both); endCompositeAction(); }
void addRange(const CallRange & range) { if (range.start <= range.stop && range.freq != FREQUENCY_NONE) { if (empty()) { limits.start = range.start; limits.stop = range.stop; } else { if (range.start < limits.start) limits.start = range.start; if (range.stop > limits.stop) limits.stop = range.stop; } RangeList::iterator it = ranges.begin(); while (it != ranges.end() && it->start < range.start) { ++it; } ranges.insert(it, range); } }
void Subtitle::removeLines(const RangeList &r, TextTarget target) { if(m_lines.isEmpty()) return; RangeList ranges = r; ranges.trimToIndex(m_lines.count() - 1); if(ranges.isEmpty()) return; if(target == Both) { beginCompositeAction(i18n("Remove Lines")); RangeList::ConstIterator rangesIt = ranges.end(), begin = ranges.begin(); do { rangesIt--; processAction(new RemoveLinesAction(*this, (*rangesIt).start(), (*rangesIt).end())); } while(rangesIt != begin); endCompositeAction(); } else if(target == Secondary) { beginCompositeAction(i18n("Remove Lines")); RangeList rangesComplement = ranges.complement(); rangesComplement.trimToRange(Range(ranges.firstIndex(), m_lines.count() - 1)); // we have to move the secondary texts up (we do it in chunks) SubtitleIterator srcIt(*this, rangesComplement); SubtitleIterator dstIt(*this, Range::upper(ranges.firstIndex())); for(; srcIt.current() && dstIt.current(); ++srcIt, ++dstIt) dstIt.current()->setSecondaryText(srcIt.current()->secondaryText()); // the remaining lines secondary text must be cleared for(; dstIt.current(); ++dstIt) dstIt.current()->setSecondaryText(SString()); endCompositeAction(); } else { // if target == Primary beginCompositeAction(i18n("Remove Lines"), true, false); RangeList mutableRanges(ranges); mutableRanges.trimToIndex(m_lines.count() - 1); // first, we need to append as many empty lines as we're to remove // we insert them with a greater time than the one of the last (non deleted) line int linesCount = m_lines.count(); Range lastRange = mutableRanges.last(); int lastIndex = lastRange.end() == linesCount - 1 ? lastRange.start() - 1 : linesCount - 1; SubtitleLine *lastLine = lastIndex < linesCount ? m_lines.at(lastIndex) : 0; Time showTime(lastLine ? lastLine->hideTime() + 100 : 0); Time hideTime(showTime + 1000); QList<SubtitleLine *> lines; for(int index = 0, size = ranges.indexesCount(); index < size; ++index) { lines.append(new SubtitleLine(SString(), SString(), showTime, hideTime)); showTime.shift(1100); hideTime.shift(1100); } processAction(new InsertLinesAction(*this, lines)); // then, we move the secondary texts down (we need to iterate from bottom to top for that) RangeList rangesComplement = mutableRanges.complement(); SubtitleIterator srcIt(*this, Range(ranges.firstIndex(), m_lines.count() - lines.count() - 1), true); SubtitleIterator dstIt(*this, rangesComplement, true); for(; srcIt.current() && dstIt.current(); --srcIt, --dstIt) dstIt.current()->setSecondaryText(srcIt.current()->secondaryText()); // finally, we can remove the specified lines RangeList::ConstIterator rangesIt = ranges.end(), begin = ranges.begin(); do { rangesIt--; processAction(new RemoveLinesAction(*this, (*rangesIt).start(), (*rangesIt).end())); } while(rangesIt != begin); endCompositeAction(); } }