1/*
2 * [The "BSD license"]
3 * Copyright (c) 2011 Terence Parr
4 * All rights reserved.
5 *
6 * Conversion to C#:
7 * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. The name of the author may not be used to endorse or promote products
19 *    derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33namespace Antlr.Runtime.Misc
34{
35    using System.Collections.Generic;
36    using InvalidOperationException = System.InvalidOperationException;
37
38    public class ListStack<T> : List<T>
39    {
40        public T Peek()
41        {
42            return Peek(0);
43        }
44
45        public T Peek(int depth)
46        {
47            T item;
48            if (!TryPeek(depth, out item))
49                throw new InvalidOperationException();
50
51            return item;
52        }
53
54        public bool TryPeek(out T item)
55        {
56            return TryPeek(0, out item);
57        }
58
59        public bool TryPeek(int depth, out T item)
60        {
61            if (depth >= Count)
62            {
63                item = default(T);
64                return false;
65            }
66
67            item = this[Count - depth - 1];
68            return true;
69        }
70
71        public T Pop()
72        {
73            T result;
74            if (!TryPop(out result))
75                throw new InvalidOperationException();
76
77            return result;
78        }
79
80        public bool TryPop(out T item)
81        {
82            if (Count == 0)
83            {
84                item = default(T);
85                return false;
86            }
87
88            item = this[Count - 1];
89            RemoveAt(Count - 1);
90            return true;
91        }
92
93        public void Push(T item)
94        {
95            Add(item);
96        }
97    }
98}
99