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
RevLine 
[298]1
2Namespace System
3Namespace Collections
[305]4Namespace Generic
[298]5
[396]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
[543]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
[298]50Class List<T>
[543]51 Inherits IList<T>
52
[298]53 items As *T
54 size As Long
55
[386]56 currentIndexForEnumerator As Long
57
[298]58 Sub Realloc( allocateSize As Long )
[519]59 items = realloc( items, allocateSize * SizeOf(T) )
[298]60 End Sub
61
62Public
63 Sub List()
64 items = GC_malloc( 1 )
[387]65
66 ' 列挙子の位置を初期化
67 Reset()
[298]68 End Sub
[543]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
[298]92 Sub ~List()
93 End Sub
94
95 /*!
96 @brief インデクサ
97 @author Daisuke Yamamoto
98 @date 2007/08/22
99 @param インデックス
100 */
[543]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
[298]105 Return items[index]
106 End Function
107
[519]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
[298]117
[519]118
[298]119 '----------------------------------------------------------------
120 ' パブリック プロパティ
121 '----------------------------------------------------------------
122
123 /*!
124 @brief Listに格納されている要素の数を取得する
125 @author Daisuke Yamamoto
126 @date 2007/08/22
127 */
[543]128 Override Function Count() As Long
[298]129 Return size
130 End Function
131
[543]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
[298]140
141 '----------------------------------------------------------------
142 ' パブリック メソッド
143 '----------------------------------------------------------------
144
145 /*!
146 @brief Listの末端に要素を追加する
147 @author Daisuke Yamamoto
148 @date 2007/08/22
149 @param 追加するオブジェクト
150 */
[543]151 Override Sub Add( item As T )
[298]152 Realloc( size + 1 )
153
154 items[size] = item
155 size++
156 End Sub
157
[543]158' Function AsReadOnly() As ReadOnlyCollection
159
[298]160 /*!
161 @brief Listからすべての要素を削除する
162 @author Daisuke Yamamoto
163 @date 2007/08/22
164 */
[543]165 Override Sub Clear()
[298]166 size = 0
167 End Sub
168
[543]169/* Override Function Contains ( item As T ) As Boolean
170 TODO
171 End Function*/
172
[298]173 /*!
174 @brief List内から、最初に出現する値のインデックスを取得する
175 @author Daisuke Yamamoto
176 @date 2007/08/22
177 @return インデックス(見つからなかったときは-1)
178 */
[543]179 Override Function IndexOf( item As T ) As Long
[298]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 */
[543]194 Override Sub Insert( index As Long, item As T )
[298]195 Realloc( size + 1 )
[519]196 memmove( items + (index+1)*SizeOf(T), items + index*SizeOf(T), (size-index)*SizeOf(T) )
[298]197 items[index] = item
198 size++
199 End Sub
[340]200
201 /*!
202 @brief List内で最初に出現する値を削除する
203 @author Daisuke Yamamoto
204 @date 2007/09/28
205 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
206 */
[543]207 Override Function Remove( item As T ) As Boolean
[340]208 Dim index = IndexOf( item )
209 If index = -1 Then
210 Return False
211 End If
[352]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 */
[543]223 Override Sub RemoveAt( index As Long )
[519]224 memmove( items + index*SizeOf(T), items + (index+1)*SizeOf(T), (size-(index+1))*SizeOf(T) )
[340]225 Realloc( size - 1 )
[344]226 size--
[352]227 End Sub
[386]228
229 /*!
[526]230 @brief Listの要素を文字列で返す
231 @author OverTaker
232 @date 2008/6/26
233 @return 文字列
234 */
235 Override Function ToString() As String
[531]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"
[526]240 Next
[531]241 Return string + This[i].ToString()
[526]242 End Function
243
244 /*!
[386]245 @brief IEnumeratorインターフェイスを取得する
246 @author Daisuke Yamamoto
247 @date 2007/11/19
248 @return IEnumeratorインターフェイスが返る
249 */
[543]250 Override Function GetEnumerator() As IEnumerator<T>
[386]251 Return This
252 End Function
253
254 /*!
255 @brief イテレータのカレントインデックスを増加させる
256 @author Daisuke Yamamoto
257 @date 2007/11/19
258 @return 上限に達していなければTrueが、達していればFalseが返る
259 */
[543]260 Override Function MoveNext() As Boolean
[387]261 If currentIndexForEnumerator + 1 >= size Then
[386]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 */
[543]275 Override Sub Reset()
[387]276 currentIndexForEnumerator = -1
[386]277 End Sub
278
279 /*!
280 @brief イテレータのカレントオブジェクトを取得する
281 @author Daisuke Yamamoto
282 @date 2007/11/19
283 @return カレントオブジェクトが返る
284 */
[543]285 Override Function Current() As T
[387]286 If currentIndexForEnumerator = -1 Then
287 ' MoveNextメソッドがReset後、一度も呼び出されなかった
288 Return Nothing
289 End If
[396]290 Return items[currentIndexForEnumerator]
[386]291 End Function
[298]292End Class
293
[543]294
[298]295End Namespace
296End Namespace
[305]297End Namespace
Note: See TracBrowser for help on using the repository browser.