]> git.saurik.com Git - bison.git/blame - data/stack.hh
version 3.0.1
[bison.git] / data / stack.hh
CommitLineData
51bacae6
AD
1# C++ skeleton for Bison
2
7d6bad19 3# Copyright (C) 2002-2013 Free Software Foundation, Inc.
51bacae6
AD
4
5# This program is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18m4_pushdef([b4_copyright_years],
7d6bad19 19 [2002-2013])
51bacae6 20
5de5b987
AD
21# b4_stack_define
22# ---------------
23m4_define([b4_stack_define],
e7b26e94 24[[ template <class T, class S = std::vector<T> >
51bacae6
AD
25 class stack
26 {
27 public:
28 // Hide our reversed order.
29 typedef typename S::reverse_iterator iterator;
30 typedef typename S::const_reverse_iterator const_iterator;
31
32 stack ()
33 : seq_ ()
34 {
35 }
36
37 stack (unsigned int n)
38 : seq_ (n)
39 {
40 }
41
42 inline
43 T&
5f87211c 44 operator[] (unsigned int i)
51bacae6 45 {
e7b26e94 46 return seq_[seq_.size () - 1 - i];
51bacae6
AD
47 }
48
49 inline
50 const T&
5f87211c 51 operator[] (unsigned int i) const
51bacae6 52 {
e7b26e94 53 return seq_[seq_.size () - 1 - i];
51bacae6
AD
54 }
55
97ae878e
AD
56 /// Steal the contents of \a t.
57 ///
58 /// Close to move-semantics.
51bacae6
AD
59 inline
60 void
97ae878e 61 push (T& t)
51bacae6 62 {
97ae878e
AD
63 seq_.push_back (T());
64 operator[](0).move (t);
51bacae6
AD
65 }
66
67 inline
68 void
69 pop (unsigned int n = 1)
70 {
71 for (; n; --n)
e7b26e94 72 seq_.pop_back ();
51bacae6
AD
73 }
74
e83be476
AD
75 void
76 clear ()
77 {
78 seq_.clear ();
79 }
80
51bacae6
AD
81 inline
82 typename S::size_type
83 size () const
84 {
85 return seq_.size ();
86 }
87
88 inline
89 const_iterator
90 begin () const
91 {
92 return seq_.rbegin ();
93 }
94
95 inline
96 const_iterator
97 end () const
98 {
99 return seq_.rend ();
100 }
101
102 private:
e83be476
AD
103 stack (const stack&);
104 stack& operator= (const stack&);
51bacae6
AD
105 /// The wrapped container.
106 S seq_;
107 };
108
109 /// Present a slice of the top of a stack.
110 template <class T, class S = stack<T> >
111 class slice
112 {
113 public:
114 slice (const S& stack, unsigned int range)
a9b67b5b
AD
115 : stack_ (stack)
116 , range_ (range)
51bacae6
AD
117 {
118 }
119
120 inline
121 const T&
122 operator [] (unsigned int i) const
123 {
124 return stack_[range_ - i];
125 }
126
127 private:
128 const S& stack_;
129 unsigned int range_;
130 };
5de5b987
AD
131]])
132
133b4_defines_if(
064e42b0 134[b4_output_begin([b4_dir_prefix[]stack.hh])
5de5b987
AD
135b4_copyright([Stack handling for Bison parsers in C++])[
136
137/**
138 ** \file ]b4_dir_prefix[stack.hh
139 ** Define the ]b4_namespace_ref[::stack class.
140 */
141
142]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
143
e7b26e94 144# include <vector>
5de5b987
AD
145
146]b4_namespace_open[
147]b4_stack_define[
51bacae6
AD
148]b4_namespace_close[
149
22172d47 150]b4_cpp_guard_close([b4_dir_prefix[]stack.hh])
1c7ec959 151b4_output_end()
5de5b987 152])
1c7ec959
AD
153
154m4_popdef([b4_copyright_years])