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 }