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
Line 
1
2Namespace System
3Namespace Collections
4Namespace Generic
5
6Class List<T>
7 Inherits IList<T>
8
9 items As *T
10 size As Long
11
12 currentIndexForEnumerator As Long
13
14 Sub Realloc( allocateSize As Long )
15 items = realloc( items, allocateSize * SizeOf(T) )
16 End Sub
17
18Public
19 Sub List()
20 items = GC_malloc( 1 )
21
22 ' 列挙子の位置を初期化
23 Reset()
24 End Sub
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
48 Sub ~List()
49 End Sub
50
51 /*!
52 @brief インデクサ
53 @author Daisuke Yamamoto
54 @date 2007/08/22
55 @param インデックス
56 */
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
61 Return items[index]
62 End Function
63
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
73
74
75 '----------------------------------------------------------------
76 ' パブリック プロパティ
77 '----------------------------------------------------------------
78
79 /*!
80 @brief Listに格納されている要素の数を取得する
81 @author Daisuke Yamamoto
82 @date 2007/08/22
83 */
84 Override Function Count() As Long
85 Return size
86 End Function
87
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
96
97 '----------------------------------------------------------------
98 ' パブリック メソッド
99 '----------------------------------------------------------------
100
101 /*!
102 @brief Listの末端に要素を追加する
103 @author Daisuke Yamamoto
104 @date 2007/08/22
105 @param 追加するオブジェクト
106 */
107 Override Sub Add( item As T )
108 Realloc( size + 1 )
109
110 items[size] = item
111 size++
112 End Sub
113
114' Function AsReadOnly() As ReadOnlyCollection
115
116 /*!
117 @brief Listからすべての要素を削除する
118 @author Daisuke Yamamoto
119 @date 2007/08/22
120 */
121 Override Sub Clear()
122 size = 0
123 End Sub
124
125/* Override Function Contains ( item As T ) As Boolean
126 TODO
127 End Function*/
128
129 /*!
130 @brief List内から、最初に出現する値のインデックスを取得する
131 @author Daisuke Yamamoto
132 @date 2007/08/22
133 @return インデックス(見つからなかったときは-1)
134 */
135 Override Function IndexOf( item As T ) As Long
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 */
150 Override Sub Insert( index As Long, item As T )
151 Realloc( size + 1 )
152 memmove( items + (index+1)*SizeOf(T), items + index*SizeOf(T), (size-index)*SizeOf(T) )
153 items[index] = item
154 size++
155 End Sub
156
157 /*!
158 @brief List内で最初に出現する値を削除する
159 @author Daisuke Yamamoto
160 @date 2007/09/28
161 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
162 */
163 Override Function Remove( item As T ) As Boolean
164 Dim index = IndexOf( item )
165 If index = -1 Then
166 Return False
167 End If
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 */
179 Override Sub RemoveAt( index As Long )
180 memmove( items + index*SizeOf(T), items + (index+1)*SizeOf(T), (size-(index+1))*SizeOf(T) )
181 Realloc( size - 1 )
182 size--
183 End Sub
184
185 /*!
186 @brief Listの要素を文字列で返す
187 @author OverTaker
188 @date 2008/6/26
189 @return 文字列
190 */
191 Override Function ToString() As String
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"
196 Next
197 Return string + This[i].ToString()
198 End Function
199
200 /*!
201 @brief IEnumeratorインターフェイスを取得する
202 @author Daisuke Yamamoto
203 @date 2007/11/19
204 @return IEnumeratorインターフェイスが返る
205 */
206 Override Function GetEnumerator() As IEnumerator<T>
207 Return This
208 End Function
209
210 /*!
211 @brief イテレータのカレントインデックスを増加させる
212 @author Daisuke Yamamoto
213 @date 2007/11/19
214 @return 上限に達していなければTrueが、達していればFalseが返る
215 */
216 Override Function MoveNext() As Boolean
217 If currentIndexForEnumerator + 1 >= size Then
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 */
231 Override Sub Reset()
232 currentIndexForEnumerator = -1
233 End Sub
234
235 /*!
236 @brief イテレータのカレントオブジェクトを取得する
237 @author Daisuke Yamamoto
238 @date 2007/11/19
239 @return カレントオブジェクトが返る
240 */
241 Override Function Current() As T
242 If currentIndexForEnumerator = -1 Then
243 ' MoveNextメソッドがReset後、一度も呼び出されなかった
244 Return Nothing
245 End If
246 Return items[currentIndexForEnumerator]
247 End Function
248End Class
249
250
251End Namespace
252End Namespace
253End Namespace
Note: See TracBrowser for help on using the repository browser.