#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(); // Check if the CPU is already in the HashTable T foundCPU; foundCPU.setCpuId(lastDeleted.getCpuId()); if (hashTable->search(foundCPU, foundCPU, key_to_index) != -1) { std::cout << "Undo failed: CPU \"" << lastDeleted.getCpuId() << "\" already exists in the HashTable." << std::endl; return; } // 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