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 "removepiecetablechange.hpp"
0010 
0011 // lib
0012 #include "piecetable.hpp"
0013 //
0014 #include <arraychangemetrics.hpp>
0015 // KF
0016 #include <KLocalizedString>
0017 
0018 namespace KPieceTable {
0019 
0020 RemovePieceTableChange::~RemovePieceTableChange() = default;
0021 
0022 int RemovePieceTableChange::type() const { return RemoveId; }
0023 
0024 QString RemovePieceTableChange::description() const
0025 {
0026     return i18nc("name of the change", "Remove");
0027 }
0028 
0029 bool RemovePieceTableChange::merge(const AbstractPieceTableChange* other)
0030 {
0031 // TODO: remove me again after synching solved
0032 // return false;
0033     bool result = false;
0034 
0035     if (other->type() == RemoveId) {
0036         const auto* otherRemoveChange = static_cast<const RemovePieceTableChange*>(other);
0037         // other removed at the same start?
0038         if (mRemoveRange.start() == otherRemoveChange->mRemoveRange.start()) {
0039             mRemoveRange.moveEndBy(otherRemoveChange->mRemoveRange.width());
0040             mRemovedPieces.append(otherRemoveChange->mRemovedPieces);
0041             result = true;
0042         }
0043         // other removed before?
0044         else if (otherRemoveChange->mRemoveRange.nextBehindEnd() == mRemoveRange.start()) {
0045             mRemoveRange.setStart(otherRemoveChange->mRemoveRange.start());
0046             mRemovedPieces.prepend(otherRemoveChange->mRemovedPieces);
0047             result = true;
0048         }
0049     }
0050 
0051     return result;
0052 }
0053 
0054 AddressRange RemovePieceTableChange::apply(PieceTable* pieceTable) const
0055 {
0056     const Address oldLast = pieceTable->size() - 1;
0057 
0058     pieceTable->remove(mRemoveRange);
0059 
0060     return AddressRange(mRemoveRange.start(), oldLast);
0061 }
0062 
0063 AddressRange RemovePieceTableChange::revert(PieceTable* pieceTable) const
0064 {
0065     pieceTable->insert(mRemoveRange.start(), mRemovedPieces);
0066 
0067     return AddressRange(mRemoveRange.start(), pieceTable->size() - 1);
0068 }
0069 
0070 ArrayChangeMetrics RemovePieceTableChange::metrics() const
0071 {
0072     return ArrayChangeMetrics::asReplacement(mRemoveRange.start(), mRemoveRange.width(), 0);
0073 }
0074 
0075 }