source: trunk/ab5.0/ablib/src/Classes/System/Collections/Generic/List.ab@ 543

Last change on this file since 543 was 543, checked in by NoWest, 16 years ago

無理矢理だがICollection<T>とIList<T>を実装。
コンストラクタを追加。

File size: 6.3 KB
Line 
1
2Namespace System
3Namespace Collections
4Namespace Generic
5
6Interface IEnumerable<T>
7 ' Method
8 Function GetEnumerator() As IEnumerator<T>
9End Interface
10
11Interface IEnumerator<T>
12 ' Methods
13 Function MoveNext() As Boolean
14 Sub Reset()
15 ' Property
16 Function Current() As T
17End Interface
18
19
20Class ICollection<T>
21 Implements IEnumerable<T>, IEnumerator<T>
22Public
23 ' Property
24 Abstract Function Count() As Long
25 Abstract Function IsReadOnly() As Boolean
26
27 ' Methods
28 Abstract Sub Add( item As T )
29 Abstract Sub Clear()
30' Abstract Function Contains ( item As T ) As Boolean
31' Abstract Sub CopyTo (ByRef array As List<T>, arrayIndex As Long )
32 Abstract Function Remove( item As T ) As Boolean
33End Class
34
35
36Class IList<T>
37 Inherits ICollection<T>
38Public
39 ' Property
40 Abstract Sub Operator[] ( index As Long, item As T )
41 Abstract Function Operator[] ( index As Long ) As T
42 ' Methods
43' Abstract Function Item ( index As Long ) As T
44 Abstract Function IndexOf( item As T ) As Long
45 Abstract Sub Insert( index As Long, item As T )
46 Abstract Sub RemoveAt( index As Long )
47End Class
48
49
50Class List<T>
51 Inherits IList<T>
52
53 items As *T
54 size As Long
55
56 currentIndexForEnumerator As Long
57
58 Sub Realloc( allocateSize As Long )
59 items = realloc( items, allocateSize * SizeOf(T) )
60 End Sub
61
62Public
63 Sub List()
64 items = GC_malloc( 1 )
65
66 ' 列挙子の位置を初期化
67 Reset()
68 End Sub
69
70 /*!
71 @brief 予め要素数を指定してList<T>を初期化
72 @author NoWest
73 @date 2008/07/13
74 @param リストの要素数
75 */
76 Sub List( capacity As Long )
77 This.List()
78 This.Realloc( capacity )
79 End Sub
80
81 /*!
82 @brief 既存の配列List<T>を初期化
83 @author NoWest
84 @date 2008/07/13
85 @param インデックス
86 */
87 Sub List( array As *T, count As Long )
88 This.List( count )
89 memmove( This.items, array, count * SizeOf(T) )
90 This.size = count
91 End Sub
92 Sub ~List()
93 End Sub
94
95 /*!
96 @brief インデクサ
97 @author Daisuke Yamamoto
98 @date 2007/08/22
99 @param インデックス
100 */
101 Override Sub Operator[] ( index As Long, item As T )
102 items[index]=item
103 End Sub
104 Override Function Operator[] ( index As Long ) As T
105 Return items[index]
106 End Function
107
108 /*!
109 @brief ポインタ型へのキャスト
110 @author Daisuke Yamamoto
111 @date 2007/08/22
112 @param インデックス
113 */
114 Function Operator() As *T
115 Return items
116 End Function
117
118
119 '----------------------------------------------------------------
120 ' パブリック プロパティ
121 '----------------------------------------------------------------
122
123 /*!
124 @brief Listに格納されている要素の数を取得する
125 @author Daisuke Yamamoto
126 @date 2007/08/22
127 */
128 Override Function Count() As Long
129 Return size
130 End Function
131
132 /*!
133 @brief Listが読み込み専用かどうかを取得する
134 @author NoWest
135 @date 2008/07/12
136 */
137 Override Function IsReadOnly() As Boolean
138 Return False
139 End Function
140
141 '----------------------------------------------------------------
142 ' パブリック メソッド
143 '----------------------------------------------------------------
144
145 /*!
146 @brief Listの末端に要素を追加する
147 @author Daisuke Yamamoto
148 @date 2007/08/22
149 @param 追加するオブジェクト
150 */
151 Override Sub Add( item As T )
152 Realloc( size + 1 )
153
154 items[size] = item
155 size++
156 End Sub
157
158' Function AsReadOnly() As ReadOnlyCollection
159
160 /*!
161 @brief Listからすべての要素を削除する
162 @author Daisuke Yamamoto
163 @date 2007/08/22
164 */
165 Override Sub Clear()
166 size = 0
167 End Sub
168
169/* Override Function Contains ( item As T ) As Boolean
170 TODO
171 End Function*/
172
173 /*!
174 @brief List内から、最初に出現する値のインデックスを取得する
175 @author Daisuke Yamamoto
176 @date 2007/08/22
177 @return インデックス(見つからなかったときは-1)
178 */
179 Override Function IndexOf( item As T ) As Long
180 Dim i As Long
181 For i = 0 To ELM(size)
182 If items[i].Equals(item) Then
183 Return i
184 End If
185 Next
186 Return -1
187 End Function
188
189 /*!
190 @brief List内の指定したインデックスの位置に要素を挿入する
191 @author Daisuke Yamamoto
192 @date 2007/08/22
193 */
194 Override Sub Insert( index As Long, item As T )
195 Realloc( size + 1 )
196 memmove( items + (index+1)*SizeOf(T), items + index*SizeOf(T), (size-index)*SizeOf(T) )
197 items[index] = item
198 size++
199 End Sub
200
201 /*!
202 @brief List内で最初に出現する値を削除する
203 @author Daisuke Yamamoto
204 @date 2007/09/28
205 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
206 */
207 Override Function Remove( item As T ) As Boolean
208 Dim index = IndexOf( item )
209 If index = -1 Then
210 Return False
211 End If
212
213 RemoveAt( index )
214 Return True
215 End Function
216
217 /*!
218 @brief List内の指定したインデックスの要素を削除する
219 @author Daisuke Yamamoto
220 @date 2007/10/03
221 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
222 */
223 Override Sub RemoveAt( index As Long )
224 memmove( items + index*SizeOf(T), items + (index+1)*SizeOf(T), (size-(index+1))*SizeOf(T) )
225 Realloc( size - 1 )
226 size--
227 End Sub
228
229 /*!
230 @brief Listの要素を文字列で返す
231 @author OverTaker
232 @date 2008/6/26
233 @return 文字列
234 */
235 Override Function ToString() As String
236 Dim string As String
237 Dim i As Long
238 For i = 0 To This.Count-2
239 string += This[i].ToString() + Ex"\r\n"
240 Next
241 Return string + This[i].ToString()
242 End Function
243
244 /*!
245 @brief IEnumeratorインターフェイスを取得する
246 @author Daisuke Yamamoto
247 @date 2007/11/19
248 @return IEnumeratorインターフェイスが返る
249 */
250 Override Function GetEnumerator() As IEnumerator<T>
251 Return This
252 End Function
253
254 /*!
255 @brief イテレータのカレントインデックスを増加させる
256 @author Daisuke Yamamoto
257 @date 2007/11/19
258 @return 上限に達していなければTrueが、達していればFalseが返る
259 */
260 Override Function MoveNext() As Boolean
261 If currentIndexForEnumerator + 1 >= size Then
262 ' 上限に達した
263 Return False
264 End If
265
266 currentIndexForEnumerator ++
267 Return True
268 End Function
269
270 /*!
271 @brief イテレータをリセットする
272 @author Daisuke Yamamoto
273 @date 2007/11/19
274 */
275 Override Sub Reset()
276 currentIndexForEnumerator = -1
277 End Sub
278
279 /*!
280 @brief イテレータのカレントオブジェクトを取得する
281 @author Daisuke Yamamoto
282 @date 2007/11/19
283 @return カレントオブジェクトが返る
284 */
285 Override Function Current() As T
286 If currentIndexForEnumerator = -1 Then
287 ' MoveNextメソッドがReset後、一度も呼び出されなかった
288 Return Nothing
289 End If
290 Return items[currentIndexForEnumerator]
291 End Function
292End Class
293
294
295End Namespace
296End Namespace
297End Namespace
Note: See TracBrowser for help on using the repository browser.