105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# C++ skeleton for Bison 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Copyright (C) 2002-2012 Free Software Foundation, Inc. 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is free software: you can redistribute it and/or modify 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it under the terms of the GNU General Public License as published by 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the Free Software Foundation, either version 3 of the License, or 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (at your option) any later version. 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is distributed in the hope that it will be useful, 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# but WITHOUT ANY WARRANTY; without even the implied warranty of 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# GNU General Public License for more details. 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# You should have received a copy of the GNU General Public License 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# along with this program. If not, see <http://www.gnu.org/licenses/>. 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_pushdef([b4_copyright_years], 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang [2002-2012]) 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wangb4_output_begin([b4_dir_prefix[]stack.hh]) 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wangb4_copyright([Stack handling for Bison parsers in C++], 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang [2002-2012])[ 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang ** \file ]b4_dir_prefix[stack.hh 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang ** Define the ]b4_namespace_ref[::stack class. 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[ 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <deque> 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_namespace_open[ 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang template <class T, class S = std::deque<T> > 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang class stack 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang public: 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang // Hide our reversed order. 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang typedef typename S::reverse_iterator iterator; 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang typedef typename S::const_reverse_iterator const_iterator; 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang stack () : seq_ () 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang stack (unsigned int n) : seq_ (n) 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang T& 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator [] (unsigned int i) 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang return seq_[i]; 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang const T& 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator [] (unsigned int i) const 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return seq_[i]; 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang void 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang push (const T& t) 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang seq_.push_front (t); 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang void 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang pop (unsigned int n = 1) 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (; n; --n) 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang seq_.pop_front (); 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang height () const 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return seq_.size (); 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline const_iterator begin () const { return seq_.rbegin (); } 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline const_iterator end () const { return seq_.rend (); } 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang private: 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang S seq_; 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang }; 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Present a slice of the top of a stack. 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang template <class T, class S = stack<T> > 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang class slice 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang public: 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang slice (const S& stack, unsigned int range) 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang : stack_ (stack) 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang , range_ (range) 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const T& 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang operator [] (unsigned int i) const 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang return stack_[range_ - i]; 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang private: 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang const S& stack_; 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int range_; 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang }; 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_namespace_close[ 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang]b4_cpp_guard_close([b4_dir_prefix[]stack.hh]) 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wangb4_output_end() 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wangm4_popdef([b4_copyright_years]) 122