File indexing completed on 2024-05-26 04:59:27

0001 /*
0002     SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar>
0003     SPDX-FileCopyrightText: 2010-2022 Mladen Milinkovic <max@smoothware.net>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "subtitleiterator.h"
0009 #include "subtitleline.h"
0010 #include "core/subtitle.h"
0011 
0012 using namespace SubtitleComposer;
0013 
0014 SubtitleIterator::SubtitleIterator(const Subtitle &subtitle, const RangeList &ranges, bool gotoLast) :
0015     QObject(0),
0016     m_subtitle(&subtitle),
0017     m_ranges(ranges)
0018 {
0019     if(m_subtitle->isEmpty())
0020         m_ranges.clear();
0021     else
0022         m_ranges.trimToIndex(m_subtitle->lastIndex());
0023 
0024     if(m_ranges.isEmpty()) {
0025         m_index = Invalid;              // no operations allowed
0026         if(m_subtitle->linesCount())
0027             qDebug() << "SubtitleIterator requested with empty ranges list";
0028     } else {
0029         m_index = Invalid - 1;  // a non INVALID index (needed only for initialization)
0030         if(gotoLast)
0031             toLast();
0032         else
0033             toFirst();
0034     }
0035 }
0036 
0037 SubtitleIterator::SubtitleIterator(const SubtitleIterator &it) :
0038     QObject(0),
0039     m_subtitle(it.m_subtitle),
0040     m_ranges(it.m_ranges),
0041     m_index(it.m_index),
0042     m_rangesIterator(it.m_rangesIterator)
0043 {
0044 }
0045 
0046 SubtitleIterator &
0047 SubtitleIterator::operator=(const SubtitleIterator &it)
0048 {
0049     if(&it != this) {
0050 
0051         m_subtitle = it.m_subtitle;
0052         m_ranges = it.m_ranges;
0053         m_index = it.m_index;
0054         m_rangesIterator = it.m_rangesIterator;
0055     }
0056 
0057     return *this;
0058 }
0059 
0060 SubtitleIterator::~SubtitleIterator()
0061 {
0062 }
0063 
0064 RangeList
0065 SubtitleIterator::ranges() const
0066 {
0067     return m_ranges;
0068 }
0069 
0070 void
0071 SubtitleIterator::toFirst()
0072 {
0073     if(m_index == Invalid)
0074         return;
0075 
0076     m_rangesIterator = m_ranges.begin();
0077     m_index = m_ranges.firstIndex();
0078 }
0079 
0080 void
0081 SubtitleIterator::toLast()
0082 {
0083     if(m_index == Invalid)
0084         return;
0085 
0086     m_rangesIterator = m_ranges.end();
0087     m_rangesIterator--; // safe because m_ranges is not empty (m_index != Invalid)
0088     m_index = m_ranges.lastIndex();
0089 }
0090 
0091 bool
0092 SubtitleIterator::toIndex(const int index)
0093 {
0094     Q_ASSERT(index >= 0);
0095     Q_ASSERT(index <= Range::MaxIndex);
0096 
0097     if(m_index == Invalid)
0098         return false;
0099 
0100     m_rangesIterator = m_ranges.begin();
0101     while(m_rangesIterator != m_ranges.end()) {
0102         if(m_rangesIterator->contains(index)) {
0103             m_index = index;
0104             return true;
0105         }
0106     }
0107 
0108     return false;
0109 }
0110 
0111 SubtitleIterator &
0112 SubtitleIterator::operator++()
0113 {
0114     if(m_index == Invalid || m_index == AfterLast)
0115         return *this;
0116 
0117     if(m_index == BehindFirst) {
0118         toFirst();
0119     } else {
0120         m_index++;
0121         if(m_index > m_rangesIterator->end()) {
0122             m_rangesIterator++;
0123             m_index = m_rangesIterator == m_ranges.end() ? AfterLast : m_rangesIterator->start();
0124         }
0125     }
0126 
0127     return *this;
0128 }
0129 
0130 SubtitleIterator &
0131 SubtitleIterator::operator--()
0132 {
0133     if(m_index == Invalid || m_index == BehindFirst)
0134         return *this;
0135 
0136     if(m_index == AfterLast) {
0137         toLast();
0138     } else {
0139         m_index--;
0140         if(m_index < m_rangesIterator->start()) {
0141             m_index = m_rangesIterator == m_ranges.begin() ? BehindFirst : m_rangesIterator->end();
0142             m_rangesIterator--;
0143         }
0144     }
0145 
0146     return *this;
0147 }
0148 
0149 SubtitleIterator &
0150 SubtitleIterator::operator+=(int steps)
0151 {
0152     if(steps < 0)
0153         return operator-=(-steps);
0154 
0155     if(m_index == Invalid || m_index == AfterLast)
0156         return *this;
0157 
0158     while(steps--)
0159         operator++();
0160 
0161     return *this;
0162 }
0163 
0164 SubtitleIterator &
0165 SubtitleIterator::operator-=(int steps)
0166 {
0167     if(steps < 0)
0168         return operator+=(-steps);
0169 
0170     if(m_index == Invalid || m_index == BehindFirst)
0171         return *this;
0172 
0173     while(steps--)
0174         operator--();
0175 
0176     return *this;
0177 }