xref: /aosp_15_r20/prebuilts/build-tools/common/bison/skeletons/stack.hh (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker # C++ skeleton for Bison
2*cda5da8dSAndroid Build Coastguard Worker 
3*cda5da8dSAndroid Build Coastguard Worker # Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
4*cda5da8dSAndroid Build Coastguard Worker 
5*cda5da8dSAndroid Build Coastguard Worker # This program is free software: you can redistribute it and/or modify
6*cda5da8dSAndroid Build Coastguard Worker # it under the terms of the GNU General Public License as published by
7*cda5da8dSAndroid Build Coastguard Worker # the Free Software Foundation, either version 3 of the License, or
8*cda5da8dSAndroid Build Coastguard Worker # (at your option) any later version.
9*cda5da8dSAndroid Build Coastguard Worker #
10*cda5da8dSAndroid Build Coastguard Worker # This program is distributed in the hope that it will be useful,
11*cda5da8dSAndroid Build Coastguard Worker # but WITHOUT ANY WARRANTY; without even the implied warranty of
12*cda5da8dSAndroid Build Coastguard Worker # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*cda5da8dSAndroid Build Coastguard Worker # GNU General Public License for more details.
14*cda5da8dSAndroid Build Coastguard Worker #
15*cda5da8dSAndroid Build Coastguard Worker # You should have received a copy of the GNU General Public License
16*cda5da8dSAndroid Build Coastguard Worker # along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*cda5da8dSAndroid Build Coastguard Worker 
18*cda5da8dSAndroid Build Coastguard Worker 
19*cda5da8dSAndroid Build Coastguard Worker # b4_stack_file
20*cda5da8dSAndroid Build Coastguard Worker # -------------
21*cda5da8dSAndroid Build Coastguard Worker # Name of the file containing the stack class, if we want this file.
22*cda5da8dSAndroid Build Coastguard Worker b4_header_if([b4_required_version_if([30200], [],
23*cda5da8dSAndroid Build Coastguard Worker                                      [m4_define([b4_stack_file], [stack.hh])])])
24*cda5da8dSAndroid Build Coastguard Worker 
25*cda5da8dSAndroid Build Coastguard Worker 
26*cda5da8dSAndroid Build Coastguard Worker # b4_stack_define
27*cda5da8dSAndroid Build Coastguard Worker # ---------------
28*cda5da8dSAndroid Build Coastguard Worker m4_define([b4_stack_define],
29*cda5da8dSAndroid Build Coastguard Worker [[    /// A stack with random access from its top.
30*cda5da8dSAndroid Build Coastguard Worker     template <typename T, typename S = std::vector<T> >
31*cda5da8dSAndroid Build Coastguard Worker     class stack
32*cda5da8dSAndroid Build Coastguard Worker     {
33*cda5da8dSAndroid Build Coastguard Worker     public:
34*cda5da8dSAndroid Build Coastguard Worker       // Hide our reversed order.
35*cda5da8dSAndroid Build Coastguard Worker       typedef typename S::iterator iterator;
36*cda5da8dSAndroid Build Coastguard Worker       typedef typename S::const_iterator const_iterator;
37*cda5da8dSAndroid Build Coastguard Worker       typedef typename S::size_type size_type;
38*cda5da8dSAndroid Build Coastguard Worker       typedef typename std::ptrdiff_t index_type;
39*cda5da8dSAndroid Build Coastguard Worker 
40*cda5da8dSAndroid Build Coastguard Worker       stack (size_type n = 200) YY_NOEXCEPT
41*cda5da8dSAndroid Build Coastguard Worker         : seq_ (n)
42*cda5da8dSAndroid Build Coastguard Worker       {}
43*cda5da8dSAndroid Build Coastguard Worker 
44*cda5da8dSAndroid Build Coastguard Worker #if 201103L <= YY_CPLUSPLUS
45*cda5da8dSAndroid Build Coastguard Worker       /// Non copyable.
46*cda5da8dSAndroid Build Coastguard Worker       stack (const stack&) = delete;
47*cda5da8dSAndroid Build Coastguard Worker       /// Non copyable.
48*cda5da8dSAndroid Build Coastguard Worker       stack& operator= (const stack&) = delete;
49*cda5da8dSAndroid Build Coastguard Worker #endif
50*cda5da8dSAndroid Build Coastguard Worker 
51*cda5da8dSAndroid Build Coastguard Worker       /// Random access.
52*cda5da8dSAndroid Build Coastguard Worker       ///
53*cda5da8dSAndroid Build Coastguard Worker       /// Index 0 returns the topmost element.
54*cda5da8dSAndroid Build Coastguard Worker       const T&
55*cda5da8dSAndroid Build Coastguard Worker       operator[] (index_type i) const
56*cda5da8dSAndroid Build Coastguard Worker       {
57*cda5da8dSAndroid Build Coastguard Worker         return seq_[size_type (size () - 1 - i)];
58*cda5da8dSAndroid Build Coastguard Worker       }
59*cda5da8dSAndroid Build Coastguard Worker 
60*cda5da8dSAndroid Build Coastguard Worker       /// Random access.
61*cda5da8dSAndroid Build Coastguard Worker       ///
62*cda5da8dSAndroid Build Coastguard Worker       /// Index 0 returns the topmost element.
63*cda5da8dSAndroid Build Coastguard Worker       T&
64*cda5da8dSAndroid Build Coastguard Worker       operator[] (index_type i)
65*cda5da8dSAndroid Build Coastguard Worker       {
66*cda5da8dSAndroid Build Coastguard Worker         return seq_[size_type (size () - 1 - i)];
67*cda5da8dSAndroid Build Coastguard Worker       }
68*cda5da8dSAndroid Build Coastguard Worker 
69*cda5da8dSAndroid Build Coastguard Worker       /// Steal the contents of \a t.
70*cda5da8dSAndroid Build Coastguard Worker       ///
71*cda5da8dSAndroid Build Coastguard Worker       /// Close to move-semantics.
72*cda5da8dSAndroid Build Coastguard Worker       void
73*cda5da8dSAndroid Build Coastguard Worker       push (YY_MOVE_REF (T) t)
74*cda5da8dSAndroid Build Coastguard Worker       {
75*cda5da8dSAndroid Build Coastguard Worker         seq_.push_back (T ());
76*cda5da8dSAndroid Build Coastguard Worker         operator[] (0).move (t);
77*cda5da8dSAndroid Build Coastguard Worker       }
78*cda5da8dSAndroid Build Coastguard Worker 
79*cda5da8dSAndroid Build Coastguard Worker       /// Pop elements from the stack.
80*cda5da8dSAndroid Build Coastguard Worker       void
81*cda5da8dSAndroid Build Coastguard Worker       pop (std::ptrdiff_t n = 1) YY_NOEXCEPT
82*cda5da8dSAndroid Build Coastguard Worker       {
83*cda5da8dSAndroid Build Coastguard Worker         for (; 0 < n; --n)
84*cda5da8dSAndroid Build Coastguard Worker           seq_.pop_back ();
85*cda5da8dSAndroid Build Coastguard Worker       }
86*cda5da8dSAndroid Build Coastguard Worker 
87*cda5da8dSAndroid Build Coastguard Worker       /// Pop all elements from the stack.
88*cda5da8dSAndroid Build Coastguard Worker       void
89*cda5da8dSAndroid Build Coastguard Worker       clear () YY_NOEXCEPT
90*cda5da8dSAndroid Build Coastguard Worker       {
91*cda5da8dSAndroid Build Coastguard Worker         seq_.clear ();
92*cda5da8dSAndroid Build Coastguard Worker       }
93*cda5da8dSAndroid Build Coastguard Worker 
94*cda5da8dSAndroid Build Coastguard Worker       /// Number of elements on the stack.
95*cda5da8dSAndroid Build Coastguard Worker       index_type
96*cda5da8dSAndroid Build Coastguard Worker       size () const YY_NOEXCEPT
97*cda5da8dSAndroid Build Coastguard Worker       {
98*cda5da8dSAndroid Build Coastguard Worker         return index_type (seq_.size ());
99*cda5da8dSAndroid Build Coastguard Worker       }
100*cda5da8dSAndroid Build Coastguard Worker 
101*cda5da8dSAndroid Build Coastguard Worker       /// Iterator on top of the stack (going downwards).
102*cda5da8dSAndroid Build Coastguard Worker       const_iterator
103*cda5da8dSAndroid Build Coastguard Worker       begin () const YY_NOEXCEPT
104*cda5da8dSAndroid Build Coastguard Worker       {
105*cda5da8dSAndroid Build Coastguard Worker         return seq_.begin ();
106*cda5da8dSAndroid Build Coastguard Worker       }
107*cda5da8dSAndroid Build Coastguard Worker 
108*cda5da8dSAndroid Build Coastguard Worker       /// Bottom of the stack.
109*cda5da8dSAndroid Build Coastguard Worker       const_iterator
110*cda5da8dSAndroid Build Coastguard Worker       end () const YY_NOEXCEPT
111*cda5da8dSAndroid Build Coastguard Worker       {
112*cda5da8dSAndroid Build Coastguard Worker         return seq_.end ();
113*cda5da8dSAndroid Build Coastguard Worker       }
114*cda5da8dSAndroid Build Coastguard Worker 
115*cda5da8dSAndroid Build Coastguard Worker       /// Present a slice of the top of a stack.
116*cda5da8dSAndroid Build Coastguard Worker       class slice
117*cda5da8dSAndroid Build Coastguard Worker       {
118*cda5da8dSAndroid Build Coastguard Worker       public:
119*cda5da8dSAndroid Build Coastguard Worker         slice (const stack& stack, index_type range) YY_NOEXCEPT
120*cda5da8dSAndroid Build Coastguard Worker           : stack_ (stack)
121*cda5da8dSAndroid Build Coastguard Worker           , range_ (range)
122*cda5da8dSAndroid Build Coastguard Worker         {}
123*cda5da8dSAndroid Build Coastguard Worker 
124*cda5da8dSAndroid Build Coastguard Worker         const T&
125*cda5da8dSAndroid Build Coastguard Worker         operator[] (index_type i) const
126*cda5da8dSAndroid Build Coastguard Worker         {
127*cda5da8dSAndroid Build Coastguard Worker           return stack_[range_ - i];
128*cda5da8dSAndroid Build Coastguard Worker         }
129*cda5da8dSAndroid Build Coastguard Worker 
130*cda5da8dSAndroid Build Coastguard Worker       private:
131*cda5da8dSAndroid Build Coastguard Worker         const stack& stack_;
132*cda5da8dSAndroid Build Coastguard Worker         index_type range_;
133*cda5da8dSAndroid Build Coastguard Worker       };
134*cda5da8dSAndroid Build Coastguard Worker 
135*cda5da8dSAndroid Build Coastguard Worker     private:
136*cda5da8dSAndroid Build Coastguard Worker #if YY_CPLUSPLUS < 201103L
137*cda5da8dSAndroid Build Coastguard Worker       /// Non copyable.
138*cda5da8dSAndroid Build Coastguard Worker       stack (const stack&);
139*cda5da8dSAndroid Build Coastguard Worker       /// Non copyable.
140*cda5da8dSAndroid Build Coastguard Worker       stack& operator= (const stack&);
141*cda5da8dSAndroid Build Coastguard Worker #endif
142*cda5da8dSAndroid Build Coastguard Worker       /// The wrapped container.
143*cda5da8dSAndroid Build Coastguard Worker       S seq_;
144*cda5da8dSAndroid Build Coastguard Worker     };
145*cda5da8dSAndroid Build Coastguard Worker ]])
146*cda5da8dSAndroid Build Coastguard Worker 
147*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([b4_stack_file],
148*cda5da8dSAndroid Build Coastguard Worker [b4_output_begin([b4_dir_prefix], [b4_stack_file])[
149*cda5da8dSAndroid Build Coastguard Worker ]b4_generated_by[
150*cda5da8dSAndroid Build Coastguard Worker // Starting with Bison 3.2, this file is useless: the structure it
151*cda5da8dSAndroid Build Coastguard Worker // used to define is now defined with the parser itself.
152*cda5da8dSAndroid Build Coastguard Worker //
153*cda5da8dSAndroid Build Coastguard Worker // To get rid of this file:
154*cda5da8dSAndroid Build Coastguard Worker // 1. add '%require "3.2"' (or newer) to your grammar file
155*cda5da8dSAndroid Build Coastguard Worker // 2. remove references to this file from your build system.
156*cda5da8dSAndroid Build Coastguard Worker ]b4_output_end[
157*cda5da8dSAndroid Build Coastguard Worker ]])
158