• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
33 namespace Antlr.Runtime.Misc
34 {
35     using System.Collections.Generic;
36     using InvalidOperationException = System.InvalidOperationException;
37 
38     public class ListStack<T> : List<T>
39     {
Peek()40         public T Peek()
41         {
42             return Peek(0);
43         }
44 
Peek(int depth)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 
TryPeek(out T item)54         public bool TryPeek(out T item)
55         {
56             return TryPeek(0, out item);
57         }
58 
TryPeek(int depth, out T item)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 
Pop()71         public T Pop()
72         {
73             T result;
74             if (!TryPop(out result))
75                 throw new InvalidOperationException();
76 
77             return result;
78         }
79 
TryPop(out T item)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 
Push(T item)93         public void Push(T item)
94         {
95             Add(item);
96         }
97     }
98 }
99