#region License
/* **********************************************************************************
 * Copyright (c) Roman Ivantsov
 * This source code is subject to terms and conditions of the MIT License
 * for Irony. A copy of the license can be found in the License.txt file
 * at the root of this distribution. 
 * By using this source code in any fashion, you are agreeing to be bound by the terms of the 
 * MIT License.
 * You must not remove this notice from this software.
 * **********************************************************************************/
#endregion

using System;
using System.Collections.Generic;
using System.Text;

namespace Irony.Compiler {
  public struct ParserStackElement {
    public readonly AstNode Node;
    public readonly ParserState State;
    public ParserStackElement(AstNode node,  ParserState state) {
      Node = node;
      State = state;
    }
    public override string ToString() {
      return State.Name + " " + Node;
    }
  }


  public class ParserStack  {
    private ParserStackElement[] _data = new ParserStackElement[InitialSize];

    public int Count {
      [System.Diagnostics.DebuggerStepThrough]
      get { return _count; }
    } int  _count; //actual count of elements currently in stack

    public ParserStackElement this[int index] {
      [System.Diagnostics.DebuggerStepThrough]
      get { return _data[index]; }
    }
    public ParserStackElement Top {
      [System.Diagnostics.DebuggerStepThrough]
      get { return this[Count - 1]; }
    }
    public void Push(AstNode node, ParserState state) {
      if (_count == _data.Length) 
        ExtendData();
      _data[_count] = new ParserStackElement(node, state);
      _count++;
    }
    public void Pop(int popCount) {
      _count -= popCount;
    }
    public void Reset() {
      //replace data array with empty array, to clear all references
      _data = new ParserStackElement[InitialSize];
      _count = 0;
    }
    private void ExtendData() {
      ParserStackElement[] newData = new ParserStackElement[_data.Length + SizeIncrement];
      Array.Copy(_data, newData, _data.Length);
      _data = newData;
    }

    private const int InitialSize = 100;
    private const int SizeIncrement = 100;
  }//class


}
