#ifndef MT2Q1_H #define MT2Q1_H /////////////////////////////////////////////////////////////// // MT2Q1.h - Scope Stack // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2012 // /////////////////////////////////////////////////////////////// #include template // application decides form of element class ScopeStack { public: typename typedef std::list::iterator iterator; void push(const element& item); element pop(); size_t size(); iterator begin(); iterator end(); private: std::list stack; // can't use std::stack - contents not visible }; // except at end template typename inline size_t ScopeStack::size() { return stack.size(); } template typename inline ScopeStack::iterator ScopeStack::begin() { return stack.begin(); } template typename inline ScopeStack::iterator ScopeStack::end() { return stack.end(); } template inline void ScopeStack::push(const element& item) { stack.push_back(item); } template element ScopeStack::pop() { element item = stack.back(); stack.pop_back(); return item; } #include template void showStack(ScopeStack& stack, bool indent=true) { if(stack.size() == 0) { std::cout << "\n ScopeStack is empty"; return; } ScopeStack::iterator iter = stack.begin(); while(iter != stack.end()) { std::string strIndent = std::string(2*stack.size(),' '); if(!indent) strIndent = ""; std::cout << "\n " << strIndent.c_str() << (iter->show()); ++iter; } } #endif