File indexing completed on 2024-04-21 05:52:56
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 "revertablepiecetable.hpp" 0010 0011 // lib 0012 #include "insertpiecetablechange.hpp" 0013 #include "removepiecetablechange.hpp" 0014 #include "replacepiecetablechange.hpp" 0015 #include "swaprangespiecetablechange.hpp" 0016 // 0017 #include <arraychangemetricslist.hpp> 0018 0019 namespace KPieceTable { 0020 0021 RevertablePieceTable::RevertablePieceTable() = default; 0022 0023 void RevertablePieceTable::init(Size size) 0024 { 0025 mPieceTable.init(size); 0026 mChangeHistory.clear(); 0027 } 0028 0029 void RevertablePieceTable::getChangeData(ArrayChangeMetrics* metrics, Address* storageOffset, int versionIndex) const 0030 { 0031 mChangeHistory.getChangeData(metrics, storageOffset, versionIndex); 0032 } 0033 0034 bool RevertablePieceTable::insert(Address dataOffset, Size length, Address* storageOffset) 0035 { 0036 *storageOffset = mChangeHistory.appliedChangesDataSize(); 0037 0038 mPieceTable.insert(dataOffset, length, *storageOffset); 0039 0040 auto* change = new InsertPieceTableChange(dataOffset, length, *storageOffset); 0041 0042 return mChangeHistory.appendChange(change); 0043 } 0044 0045 bool RevertablePieceTable::remove(const AddressRange& removeRange) 0046 { 0047 const PieceList removedPieces = mPieceTable.remove(removeRange); 0048 0049 auto* change = new RemovePieceTableChange(removeRange, removedPieces); 0050 0051 return mChangeHistory.appendChange(change); 0052 } 0053 0054 bool RevertablePieceTable::replace(const AddressRange& removeRange, Size insertLength, Size* storageSize) 0055 { 0056 *storageSize = mChangeHistory.appliedChangesDataSize(); 0057 0058 const PieceList replacedPieces = mPieceTable.remove(removeRange); 0059 mPieceTable.insert(removeRange.start(), insertLength, *storageSize); 0060 0061 auto* change = new ReplacePieceTableChange(removeRange, insertLength, *storageSize, replacedPieces); 0062 0063 return mChangeHistory.appendChange(change); 0064 } 0065 0066 bool RevertablePieceTable::swap(Address firstStart, const AddressRange& secondRange) 0067 { 0068 mPieceTable.swap(firstStart, secondRange); 0069 0070 auto* change = new SwapRangesPieceTableChange(firstStart, secondRange); 0071 0072 return mChangeHistory.appendChange(change); 0073 } 0074 0075 bool RevertablePieceTable::replaceOne(Address dataOffset, Size* storageSize) 0076 { 0077 *storageSize = mChangeHistory.appliedChangesDataSize(); 0078 0079 const Piece replacedPiece = mPieceTable.replaceOne(dataOffset, *storageSize); 0080 const PieceList replacedPieces(replacedPiece); 0081 0082 auto* change = 0083 new ReplacePieceTableChange(AddressRange::fromWidth(dataOffset, 1), 1, *storageSize, replacedPieces); 0084 0085 return mChangeHistory.appendChange(change); 0086 } 0087 0088 }