package com.opendoorlogistics.core.tables.decorators.datastores.undoredo;
import com.opendoorlogistics.core.utils.LargeList;
class UndoRedoBuffer{
private final LargeList<Transaction> list = new LargeList<>();
private long sizeInBytes=0;
long size(){
return list.longSize();
}
long sizeInBytes(){
return sizeInBytes;
}
Transaction get(long i){
return list.get(i);
}
/**
* Add command to the undo / redo buffer
* @param undoRedo
* @return True if a new transaction record was created
*/
boolean addUndoRedo(UndoRedo undoRedo){
// Create new transaction if (a) undo redo isn't in a transaction or (b) its a different transaction to the last one
boolean newTransaction = undoRedo.transactionNb==-1 || list.size()==0 || list.get(list.size()-1).transactionNb != undoRedo.transactionNb;
// Create or get transaction
Transaction transaction;
if(newTransaction){
transaction = new Transaction(undoRedo.transactionNb);
list.add(transaction);
}else{
transaction = list.get(list.size()-1);
}
transaction.undoRedo.add(undoRedo);
sizeInBytes += undoRedo.getEstimatedSizeInBytes();
return newTransaction;
}
Transaction removeTransaction(long i){
Transaction transaction = list.remove(i);
for(UndoRedo undoRedo : transaction.undoRedo){
sizeInBytes -= undoRedo.getEstimatedSizeInBytes();
}
return transaction;
}
void clear(){
list.clear();
}
}