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