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 }