#pragma once #include namespace seq { namespace ir { namespace util { /// Base for SIR visitor contexts. template class SIRContext { private: std::vector frames; public: /// Emplaces a frame onto the stack. /// @param args a parameter pack of the arguments template void emplaceFrame(Args... args) { frames.emplace_back(args...); } /// Replaces a frame. /// @param newFrame the new frame void replaceFrame(Frame newFrame) { frames.pop_back(); frames.push_back(newFrame); } /// @return all frames std::vector &getFrames() { return frames; } /// @return the current frame Frame &getFrame() { return frames.back(); } /// Pops a frame. void popFrame() { return frames.pop_back(); } }; } // namespace util } // namespace ir } // namespace seq