#pragma once #include "UndoNode.h" struct UndoTree { UndoNode *root = nullptr; // first edit ever UndoNode *current = nullptr; // current state of buffer UndoNode *saved = nullptr; // points to node matching last save (for dirty flag) UndoNode *pending = nullptr; // in-progress batch (detached) // Frees the entire node graph (root's subtree/branches plus any detached // pending node). `current`/`saved` are aliases into that same graph, not // separately owned. Without this, closing/reloading/resetting a buffer // (which replaces or destroys its UndoTree) leaks every UndoNode ever // created for it. ~UndoTree(); }; // Frees `first`, its whole child subtree, and every node on its `next` // (sibling) chain. Iterative, so history depth cannot overflow the stack. void FreeUndoForest(UndoNode *first);