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 }