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 }