X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/03f1b545b94c6699ee637b517c4941afb76eb0d9..435575cb5e28bfc20263413e837c24a95373b3d4:/data/stack.hh diff --git a/data/stack.hh b/data/stack.hh index 52933774..037c212f 100644 --- a/data/stack.hh +++ b/data/stack.hh @@ -1,6 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,27 +16,12 @@ # along with this program. If not, see . m4_pushdef([b4_copyright_years], - [2002-2012]) + [2002-2013]) -# We do want M4 expansion after # for CPP macros. -m4_changecom() -m4_divert_push(0)dnl -@output(b4_dir_prefix[]stack.hh@)@ -b4_copyright([Stack handling for Bison parsers in C++], - [2002-2012])[ - -/** - ** \file ]b4_dir_prefix[stack.hh - ** Define the ]b4_namespace_ref[::stack class. - */ - -#ifndef BISON_STACK_HH -# define BISON_STACK_HH - -# include - -]b4_namespace_open[ - template > +# b4_stack_define +# --------------- +m4_define([b4_stack_define], +[[ template > class stack { public: @@ -44,33 +29,39 @@ b4_copyright([Stack handling for Bison parsers in C++], typedef typename S::reverse_iterator iterator; typedef typename S::const_reverse_iterator const_iterator; - stack () : seq_ () + stack () + : seq_ () { } - stack (unsigned int n) : seq_ (n) + stack (unsigned int n) + : seq_ (n) { } inline T& - operator [] (unsigned int i) + operator[] (unsigned int i) { - return seq_[i]; + return seq_[seq_.size () - 1 - i]; } inline const T& - operator [] (unsigned int i) const + operator[] (unsigned int i) const { - return seq_[i]; + return seq_[seq_.size () - 1 - i]; } + /// Steal the contents of \a t. + /// + /// Close to move-semantics. inline void - push (const T& t) + push (T& t) { - seq_.push_front (t); + seq_.push_back (T()); + operator[](0).move (t); } inline @@ -78,20 +69,32 @@ b4_copyright([Stack handling for Bison parsers in C++], pop (unsigned int n = 1) { for (; n; --n) - seq_.pop_front (); + seq_.pop_back (); } inline - unsigned int - height () const + typename S::size_type + size () const { return seq_.size (); } - inline const_iterator begin () const { return seq_.rbegin (); } - inline const_iterator end () const { return seq_.rend (); } + inline + const_iterator + begin () const + { + return seq_.rbegin (); + } + + inline + const_iterator + end () const + { + return seq_.rend (); + } private: + /// The wrapped container. S seq_; }; @@ -117,10 +120,27 @@ b4_copyright([Stack handling for Bison parsers in C++], const S& stack_; unsigned int range_; }; +]]) + +b4_defines_if( +[b4_output_begin([b4_dir_prefix[]stack.hh]) +b4_copyright([Stack handling for Bison parsers in C++])[ + +/** + ** \file ]b4_dir_prefix[stack.hh + ** Define the ]b4_namespace_ref[::stack class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[ + +# include + +]b4_namespace_open[ +]b4_stack_define[ ]b4_namespace_close[ -#endif // not BISON_STACK_HH[]dnl -] -m4_divert_pop(0) -m4_popdef([b4_copyright_years])dnl -m4_changecom([#]) +]b4_cpp_guard_close([b4_dir_prefix[]stack.hh]) +b4_output_end() +]) + +m4_popdef([b4_copyright_years])