stack.hh 3.62 KB
Newer Older
1
// Generated 201809140750
Francis Dupont's avatar
Francis Dupont committed
2
// A Bison parser, made by GNU Bison 3.0.5.
3 4 5

// Stack handling for Bison parsers in C++

Francis Dupont's avatar
Francis Dupont committed
6
// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

// 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
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

// As a special exception, you may create a larger work that contains
// part or all of the Bison parser skeleton and distribute that work
// under terms of your choice, so long as that work isn't itself a
// parser generator using the skeleton or a modified version thereof
// as a parser skeleton.  Alternatively, if you modify or redistribute
// the parser skeleton itself, you may (at your option) remove this
// special exception, which will cause the skeleton and the resulting
// Bison output files to be licensed under the GNU General Public
// License without this special exception.

// This special exception was added by the Free Software Foundation in
// version 2.2 of Bison.

/**
 ** \file stack.hh
 ** Define the isc::dhcp::stack class.
 */

#ifndef YY_PARSER4_STACK_HH_INCLUDED
# define YY_PARSER4_STACK_HH_INCLUDED

# include <vector>

Francis Dupont's avatar
Francis Dupont committed
44
#line 14 "dhcp4_parser.yy" // stack.hh:131
45
namespace isc { namespace dhcp {
Francis Dupont's avatar
Francis Dupont committed
46 47
#line 46 "stack.hh" // stack.hh:131
  /// A stack with random access from its top.
48 49 50 51 52 53 54 55 56 57 58 59 60 61
  template <class T, class S = std::vector<T> >
  class stack
  {
  public:
    // Hide our reversed order.
    typedef typename S::reverse_iterator iterator;
    typedef typename S::const_reverse_iterator const_iterator;

    stack ()
      : seq_ ()
    {
      seq_.reserve (200);
    }

Francis Dupont's avatar
Francis Dupont committed
62
    stack (unsigned n)
63 64 65
      : seq_ (n)
    {}

Francis Dupont's avatar
Francis Dupont committed
66 67 68
    /// Random access.
    ///
    /// Index 0 returns the topmost element.
69
    T&
Francis Dupont's avatar
Francis Dupont committed
70
    operator[] (unsigned i)
71 72 73 74
    {
      return seq_[seq_.size () - 1 - i];
    }

Francis Dupont's avatar
Francis Dupont committed
75 76 77
    /// Random access.
    ///
    /// Index 0 returns the topmost element.
78
    const T&
Francis Dupont's avatar
Francis Dupont committed
79
    operator[] (unsigned i) const
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    {
      return seq_[seq_.size () - 1 - i];
    }

    /// Steal the contents of \a t.
    ///
    /// Close to move-semantics.
    void
    push (T& t)
    {
      seq_.push_back (T());
      operator[](0).move (t);
    }

    void
Francis Dupont's avatar
Francis Dupont committed
95
    pop (unsigned n = 1)
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
    {
      for (; n; --n)
        seq_.pop_back ();
    }

    void
    clear ()
    {
      seq_.clear ();
    }

    typename S::size_type
    size () const
    {
      return seq_.size ();
    }

    const_iterator
    begin () const
    {
      return seq_.rbegin ();
    }

    const_iterator
    end () const
    {
      return seq_.rend ();
    }

  private:
    stack (const stack&);
    stack& operator= (const stack&);
    /// The wrapped container.
    S seq_;
  };

  /// Present a slice of the top of a stack.
  template <class T, class S = stack<T> >
  class slice
  {
  public:
Francis Dupont's avatar
Francis Dupont committed
137
    slice (const S& stack, unsigned range)
138 139 140 141 142
      : stack_ (stack)
      , range_ (range)
    {}

    const T&
Francis Dupont's avatar
Francis Dupont committed
143
    operator [] (unsigned i) const
144 145 146 147 148 149
    {
      return stack_[range_ - i];
    }

  private:
    const S& stack_;
Francis Dupont's avatar
Francis Dupont committed
150
    unsigned range_;
151 152
  };

Francis Dupont's avatar
Francis Dupont committed
153
#line 14 "dhcp4_parser.yy" // stack.hh:131
154
} } // isc::dhcp
Francis Dupont's avatar
Francis Dupont committed
155
#line 155 "stack.hh" // stack.hh:131
156 157

#endif // !YY_PARSER4_STACK_HH_INCLUDED