source: trunk/ab5.0/ablib/src/Classes/System/Collections/Generic/Stack.ab@ 560

Last change on this file since 560 was 560, checked in by dai, 16 years ago

#183への対応。コンストラクタ、デストラクタが直接呼び出された場合はエラーとして扱うようにした。
(64bit版は後ほどコミットします)

File size: 3.1 KB
Line 
1
2Namespace System
3Namespace Collections
4Namespace Generic
5
6Class Stack<T>
7 Inherits ICollection
8
9 items As *T
10 size As Long
11 count As Long
12
13 Sub Realloc ( allocateSize As Long )
14 This.items = realloc( This.items, allocateSize * SizeOf(T) )
15 End Sub
16
17Public
18 Sub Stack ()
19 This.items = GC_malloc( 1 )
20 Reset()
21 End Sub
22
23 Sub Stack ( capacity As Long )
24 This.items = GC_malloc( 1 )
25 Reset()
26 If capacity > 0 Then
27 This.size = capacity
28 Realloc(capacity)
29 End If
30 End Sub
31
32 /*!
33 @brief Stackに格納されている要素の数を取得
34 @author NoWest
35 @date 2008/07/20
36 */
37 Override Function Count () As Long
38 Return This.count
39 End Function
40
41Public
42 /*!
43 @brief Stackからすべての要素を削除する
44 @author NoWest
45 @date 2008/07/20
46 */
47 Override Sub Clear ()
48 This.count = 0
49 End Sub
50
51 'ある要素が Stack 内に存在するかどうかを判断
52/* Override Function Contains ( item As T ) As Boolean
53 TODO
54 End Function*/
55
56 '既存の 1 次元の Array に Stack をコピーします。コピー操作は、配列の指定したインデックスから始まります。
57/* CopyTo*/
58
59 /*!
60 @brief IEnumeratorインターフェイスを取得する
61 @author NoWest
62 @date 2008/07/20
63 @return IEnumeratorインターフェイス
64 */
65 Override Function GetEnumerator () As IEnumerator<T>
66 Return This
67 End Function
68
69 /*!
70 @brief Stackの先頭にあるオブジェクトを削除せずに返します
71 @author NoWest
72 @date 2008/07/20
73 */
74 Function Peek () As T
75 Peek = This.items[ 0 ]
76 End Function
77
78 /*!
79 @brief Stackの先頭にあるオブジェクトを削除し、返します
80 @author NoWest
81 @date 2008/07/20
82 */
83 Function Pop () As T
84 Pop = This.items[ 0 ]
85 memmove( items, items + SizeOf(T), (This.count - 1)*SizeOf(T) )
86 This.count--
87 End Function
88
89 /*!
90 @brief Stackの先頭にオブジェクトを挿入します
91 @author NoWest
92 @date 2008/07/20
93 */
94 Sub Push ( item As T )
95 If This.size < (This.count + 1) Then
96 This.size++
97 Realloc( This.size )
98 End If
99 memmove( items + SizeOf(T), items, This.count * SizeOf(T) )
100 items[ 0 ] = item
101 This.count++
102 End Sub
103
104 'Stack を新しい配列にコピーします。
105/* ToArray*/
106
107 /*!
108 @brief 実際の要素数が現在の容量の 90% 未満の場合は、容量をその数に設定します
109 @author NoWest
110 @date 2008/07/20
111 */
112 Sub TrimExcess ()
113 Dim pmemobj = _System_pGC->GetMemoryObjectPtr( items )
114 If ( This.size ) * 0.9 > This.count Then
115 This.size = This.count
116 Realloc( This.size )
117 End If
118 End Sub
119
120
121 '------------------------
122 ' IEnumeratorの実装
123 '------------------------
124 currentIndexForEnumerator As Long
125
126 Override Function Current () As T
127 If This.currentIndexForEnumerator = -1 Then
128 ' MoveNextメソッドがReset後、一度も呼び出されなかった
129 Return Nothing
130 End If
131 Return This.items[ This.currentIndexForEnumerator ]
132 End Function
133
134 Override Function MoveNext() As Boolean
135 If This.currentIndexForEnumerator + 1 >= This.count Then
136 ' 上限に達した
137 Return False
138 End If
139
140 This.currentIndexForEnumerator ++
141 Return True
142 End Function
143
144 Override Sub Reset ()
145 This.currentIndexForEnumerator = -1
146 End Sub
147End Class
148
149End Namespace
150End Namespace
151End Namespace
Note: See TracBrowser for help on using the repository browser.