#ifndef UNDO_MANAGER_H #define UNDO_MANAGER_H #include "HashTable.h" #include "BinarySearchTree.h" #include "Stack.h" #include "CPU.h" template class UndoManager { private: HashTable hashTable; BinarySearchTree bst; Stack *undoStack; public: UndoManager(HashTable &ht, BinarySearchTree &bst); ~UndoManager(); void addToUndoStack(const T &cpu); void undoDelete(); void clearUndoStack(); }; template UndoManager::UndoManager(HashTable &ht, BinarySearchTree &bst) { this->hashTable = ht; this->bst = bst; this->undoStack = new Stack(); } template UndoManager::~UndoManager() { delete undoStack; } template void UndoManager::addToUndoStack(const T &cpu) { undoStack->push(cpu); } template void UndoManager::undoDelete() { if (!undoStack->isEmpty()) { T lastDeleted = undoStack->pop(); // Reinsert the CPU into the HashTable and BST hashTable.insert(lastDeleted, key_to_index); bst.insert(lastDeleted.getCpuId()); std::cout << "Undo successful. CPU reinserted:" << std::endl; std::cout << lastDeleted << std::endl; } else { std::cout << "No deletions to undo." << std::endl; } } template void UndoManager::clearUndoStack() { while (!undoStack->isEmpty()) { undoStack->pop(); } } #endif