source: trunk/Include/Classes/System/Collections/Generic/List.ab@ 387

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

Listクラスの列挙子メソッドのバグを修正。

File size: 3.9 KB
Line 
1
2Namespace System
3Namespace Collections
4Namespace Generic
5
6Class List<T>
7 Implements IEnumerable, IEnumerator
8 items As *T
9 size As Long
10
11 currentIndexForEnumerator As Long
12
13 Sub Realloc( allocateSize As Long )
14 items = realloc( items, allocateSize * SizeOf(VoidPtr) )
15 End Sub
16
17Public
18 Sub List()
19 items = GC_malloc( 1 )
20
21 ' 列挙子の位置を初期化
22 Reset()
23 End Sub
24 Sub ~List()
25 End Sub
26
27 /*!
28 @brief インデクサ
29 @author Daisuke Yamamoto
30 @date 2007/08/22
31 @param インデックス
32 */
33 Function Operator[] ( index As Long ) As T
34 Return items[index]
35 End Function
36
37
38 '----------------------------------------------------------------
39 ' パブリック プロパティ
40 '----------------------------------------------------------------
41
42 /*!
43 @brief Listに格納されている要素の数を取得する
44 @author Daisuke Yamamoto
45 @date 2007/08/22
46 */
47 Function Count() As Long
48 Return size
49 End Function
50
51
52 '----------------------------------------------------------------
53 ' パブリック メソッド
54 '----------------------------------------------------------------
55
56 /*!
57 @brief Listの末端に要素を追加する
58 @author Daisuke Yamamoto
59 @date 2007/08/22
60 @param 追加するオブジェクト
61 */
62 Sub Add( item As T )
63 Realloc( size + 1 )
64
65 items[size] = item
66 size++
67 End Sub
68
69 /*!
70 @brief Listからすべての要素を削除する
71 @author Daisuke Yamamoto
72 @date 2007/08/22
73 */
74 Sub Clear()
75 size = 0
76 End Sub
77
78 /*!
79 @brief List内から、最初に出現する値のインデックスを取得する
80 @author Daisuke Yamamoto
81 @date 2007/08/22
82 @return インデックス(見つからなかったときは-1)
83 */
84 Function IndexOf( item As T ) As Long
85 Dim i As Long
86 For i = 0 To ELM(size)
87 If items[i].Equals(item) Then
88 Return i
89 End If
90 Next
91 Return -1
92 End Function
93
94 /*!
95 @brief List内の指定したインデックスの位置に要素を挿入する
96 @author Daisuke Yamamoto
97 @date 2007/08/22
98 */
99 Sub Insert( index As Long, item As T )
100 Realloc( size + 1 )
101 memmove( items + (index+1)*SizeOf(VoidPtr), items + index*SizeOf(VoidPtr), (size-index)*SizeOf(VoidPtr) )
102 items[index] = item
103 size++
104 End Sub
105
106 /*!
107 @brief List内で最初に出現する値を削除する
108 @author Daisuke Yamamoto
109 @date 2007/09/28
110 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
111 */
112 Function Remove( item As T ) As Boolean
113 Dim index = IndexOf( item )
114 If index = -1 Then
115 Return False
116 End If
117
118 RemoveAt( index )
119 Return True
120 End Function
121
122 /*!
123 @brief List内の指定したインデックスの要素を削除する
124 @author Daisuke Yamamoto
125 @date 2007/10/03
126 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
127 */
128 Sub RemoveAt( index As Long )
129 memmove( items + index*SizeOf(VoidPtr), items + (index+1)*SizeOf(VoidPtr), (size-(index+1))*SizeOf(VoidPtr) )
130 Realloc( size - 1 )
131 size--
132 End Sub
133
134 /*!
135 @brief IEnumeratorインターフェイスを取得する
136 @author Daisuke Yamamoto
137 @date 2007/11/19
138 @return IEnumeratorインターフェイスが返る
139 */
140 Function GetEnumerator() As IEnumerator
141 Return This
142 End Function
143
144 /*!
145 @brief イテレータのカレントインデックスを増加させる
146 @author Daisuke Yamamoto
147 @date 2007/11/19
148 @return 上限に達していなければTrueが、達していればFalseが返る
149 */
150 Function MoveNext() As Boolean
151 If currentIndexForEnumerator + 1 >= size Then
152 ' 上限に達した
153 Return False
154 End If
155
156 currentIndexForEnumerator ++
157 Return True
158 End Function
159
160 /*!
161 @brief イテレータをリセットする
162 @author Daisuke Yamamoto
163 @date 2007/11/19
164 */
165 Sub Reset()
166 currentIndexForEnumerator = -1
167 End Sub
168
169 /*!
170 @brief イテレータのカレントオブジェクトを取得する
171 @author Daisuke Yamamoto
172 @date 2007/11/19
173 @return カレントオブジェクトが返る
174 */
175 Function Current() As Object
176 If currentIndexForEnumerator = -1 Then
177 ' MoveNextメソッドがReset後、一度も呼び出されなかった
178 Return Nothing
179 End If
180 Return items[currentIndexForEnumerator] As Object
181 End Function
182End Class
183
184End Namespace
185End Namespace
186End Namespace
Note: See TracBrowser for help on using the repository browser.