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

Last change on this file since 582 was 582, checked in by イグトランス (egtra), 16 years ago

非Genericコレクションインタフェースの扱いを大幅に縮小。Queue/Stackの実装インタフェースの修正。

File size: 2.3 KB
RevLine 
[557]1
2Namespace System
3Namespace Collections
4Namespace Generic
5
6Class Stack<T>
[582]7 Implements IEnumerable<T>
[557]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 End Sub
21
22 Sub Stack ( capacity As Long )
[560]23 This.items = GC_malloc( 1 )
[557]24 If capacity > 0 Then
25 This.size = capacity
26 Realloc(capacity)
27 End If
28 End Sub
29
30Public
31 /*!
32 @brief Stackからすべての要素を削除する
33 @author NoWest
34 @date 2008/07/20
35 */
[577]36 Sub Clear ()
[557]37 This.count = 0
38 End Sub
39
40 'ある要素が Stack 内に存在するかどうかを判断
41/* Override Function Contains ( item As T ) As Boolean
42 TODO
43 End Function*/
44
45 '既存の 1 次元の Array に Stack をコピーします。コピー操作は、配列の指定したインデックスから始まります。
46/* CopyTo*/
47
48 /*!
49 @brief IEnumeratorインターフェイスを取得する
50 @author NoWest
51 @date 2008/07/20
52 @return IEnumeratorインターフェイス
53 */
54 Override Function GetEnumerator () As IEnumerator<T>
[579]55 Return New Detail.PointerEnumerator(items, count)
[557]56 End Function
57
58 /*!
59 @brief Stackの先頭にあるオブジェクトを削除せずに返します
60 @author NoWest
61 @date 2008/07/20
62 */
63 Function Peek () As T
[558]64 Peek = This.items[ 0 ]
[557]65 End Function
66
67 /*!
68 @brief Stackの先頭にあるオブジェクトを削除し、返します
69 @author NoWest
70 @date 2008/07/20
71 */
72 Function Pop () As T
[558]73 Pop = This.items[ 0 ]
74 memmove( items, items + SizeOf(T), (This.count - 1)*SizeOf(T) )
[557]75 This.count--
76 End Function
77
78 /*!
79 @brief Stackの先頭にオブジェクトを挿入します
80 @author NoWest
81 @date 2008/07/20
82 */
83 Sub Push ( item As T )
[558]84 If This.size < (This.count + 1) Then
[557]85 This.size++
86 Realloc( This.size )
87 End If
[558]88 memmove( items + SizeOf(T), items, This.count * SizeOf(T) )
89 items[ 0 ] = item
90 This.count++
[557]91 End Sub
92
93 'Stack を新しい配列にコピーします。
94/* ToArray*/
95
96 /*!
97 @brief 実際の要素数が現在の容量の 90% 未満の場合は、容量をその数に設定します
98 @author NoWest
99 @date 2008/07/20
100 */
101 Sub TrimExcess ()
102 Dim pmemobj = _System_pGC->GetMemoryObjectPtr( items )
103 If ( This.size ) * 0.9 > This.count Then
104 This.size = This.count
105 Realloc( This.size )
106 End If
107 End Sub
108End Class
109
110End Namespace
111End Namespace
112End Namespace
Note: See TracBrowser for help on using the repository browser.