File indexing completed on 2024-04-28 05:52:30
0001 /* 0002 This file is part of the Okteta Core library, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2008 Friedrich W. H. Kossebau <kossebau@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "grouppiecetablechange.hpp" 0010 0011 // lib 0012 #include "piecetable.hpp" 0013 // 0014 #include <addressrangelist.hpp> 0015 #include <arraychangemetricslist.hpp> 0016 // KF 0017 #include <KLocalizedString> 0018 0019 namespace KPieceTable { 0020 0021 GroupPieceTableChange::~GroupPieceTableChange() 0022 { 0023 while (!mChangeStack.isEmpty()) { 0024 delete mChangeStack.pop(); 0025 } 0026 } 0027 0028 int GroupPieceTableChange::type() const { return GroupId; } 0029 0030 QString GroupPieceTableChange::description() const 0031 { 0032 return mDescription; 0033 } 0034 0035 bool GroupPieceTableChange::merge(const AbstractPieceTableChange* other) 0036 { 0037 bool result = false; 0038 0039 if (!mChangeStack.isEmpty()) { 0040 result = mChangeStack.last()->merge(other); 0041 } 0042 0043 return result; 0044 } 0045 0046 AddressRange GroupPieceTableChange::apply(PieceTable* pieceTable) const 0047 { 0048 Q_UNUSED(pieceTable) 0049 // pieceTable->insert( mInsertOffset, mInsertLength, mStorageOffset ); 0050 0051 return AddressRange();// ( mInsertOffset, pieceTable->size()-1 ); 0052 } 0053 0054 AddressRange GroupPieceTableChange::revert(PieceTable* pieceTable) const 0055 { 0056 Q_UNUSED(pieceTable) 0057 // const int oldLast = pieceTable->size() - 1; 0058 // pieceTable->remove( AddressRange::fromWidth(mInsertOffset,mInsertLength) ); 0059 return AddressRange();// ( mInsertOffset, oldLast ); 0060 } 0061 0062 ArrayChangeMetrics GroupPieceTableChange::metrics() const 0063 { 0064 return ArrayChangeMetrics::asReplacement(0, 0, 0); 0065 } 0066 0067 bool GroupPieceTableChange::appendChange(AbstractPieceTableChange* change) 0068 { 0069 #if 0 0070 // chop unapplied changes 0071 if (mAppliedChangesCount < mChangeStack.size()) { 0072 // hide baseindex if needed 0073 if (mBaseBeforeChangeIndex > mAppliedChangesCount) { 0074 mBaseBeforeChangeIndex = -1; 0075 } 0076 do 0077 { 0078 AbstractPieceTableChange* droppedChange = mChangeStack.pop(); 0079 delete droppedChange; 0080 } 0081 while (mAppliedChangesCount < mChangeStack.size()); 0082 } 0083 #endif 0084 mAppliedChangesDataSize += change->dataSize(); 0085 0086 bool isNotMerged = true; 0087 if (mTryToMergeAppendedChange && mAppliedChangesCount > 0) { 0088 isNotMerged = !mChangeStack.top()->merge(change); 0089 } else { 0090 mTryToMergeAppendedChange = true; 0091 } 0092 0093 if (isNotMerged) { 0094 mChangeStack.push(change); 0095 ++mAppliedChangesCount; 0096 } else { 0097 delete change; 0098 } 0099 0100 return isNotMerged; 0101 } 0102 0103 AddressRangeList GroupPieceTableChange::applyGroup(PieceTable* pieceTable) const 0104 { 0105 AddressRangeList result; 0106 0107 for (const AbstractPieceTableChange* change : mChangeStack) { 0108 if (change->type() == AbstractPieceTableChange::GroupId) { 0109 const auto* groupChange = static_cast<const GroupPieceTableChange*>(change); 0110 const AddressRangeList changedRangeList = groupChange->applyGroup(pieceTable); 0111 result.addAddressRangeList(changedRangeList); 0112 } else { 0113 result.append(change->apply(pieceTable)); 0114 } 0115 } 0116 0117 return result; 0118 } 0119 0120 AddressRangeList GroupPieceTableChange::revertGroup(PieceTable* pieceTable) const 0121 { 0122 AddressRangeList result; 0123 0124 QStack<AbstractPieceTableChange*>::ConstIterator it = mChangeStack.end(); 0125 while (it != mChangeStack.begin()) { 0126 --it; 0127 AbstractPieceTableChange* change = *it; 0128 if (change->type() == AbstractPieceTableChange::GroupId) { 0129 const auto* groupChange = static_cast<const GroupPieceTableChange*>(change); 0130 const AddressRangeList changedRangeList = groupChange->revertGroup(pieceTable); 0131 result.addAddressRangeList(changedRangeList); 0132 } else { 0133 result.append(change->revert(pieceTable)); 0134 } 0135 } 0136 0137 return result; 0138 } 0139 0140 ArrayChangeMetricsList GroupPieceTableChange::groupMetrics(bool reverted) const 0141 { 0142 ArrayChangeMetricsList result; 0143 0144 for (const AbstractPieceTableChange* change : mChangeStack) { 0145 if (change->type() == AbstractPieceTableChange::GroupId) { 0146 const auto* groupChange = static_cast<const GroupPieceTableChange*>(change); 0147 const ArrayChangeMetricsList metricsList = groupChange->groupMetrics(reverted); 0148 result += metricsList; 0149 } else { 0150 ArrayChangeMetrics changeMetrics = change->metrics(); 0151 if (reverted) { 0152 changeMetrics.revert(); 0153 } 0154 result.append(changeMetrics); 0155 } 0156 } 0157 0158 return result; 0159 } 0160 0161 Size GroupPieceTableChange::dataSize() const 0162 { 0163 return mAppliedChangesDataSize; 0164 } 0165 0166 }