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

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