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