source: trunk/Include/Classes/System/Collections/ArrayList.ab@ 309

Last change on this file since 309 was 309, checked in by イグトランス (egtra), 17 years ago

コンストラクタのLong型引数の値はcapacityを指定するものなのに、sizeまで設定されていたことを修正

File size: 8.5 KB
RevLine 
[118]1' Classes/System/Collections/ArrayList.ab
2
3#require <Classes/System/Collections/misc.ab>
4
5Class ArrayList
6 Inherits IList /*, ICollection, IEnumerable, ICloneable*/
[195]7
8 pObject As *Object
9 size As Long
10 capacity As Long
11
[309]12 Sub Init( capacity As Long )
[195]13 If size < 0 Then
14 ' Error
15 debug
16 End If
17
[309]18 This.size = 0
[195]19 This.capacity = size
20
[309]21 pObject = GC_malloc( SizeOf(*Object) * size )
[195]22 If pObject = 0 Then
23 ' OutOfMemoryException
24 Debug
25 End If
26 End Sub
27
[309]28 Sub Realloc( newSize As Long )
29' If newSize > capacity Then
30' ' miss!
31' Debug
32' End If
[195]33
[309]34 Dim p = realloc( pObject, SizeOf(*Object) * newSize )
35 If p = 0 Then
[195]36 ' OutOfMemoryException
37 Debug
[309]38 Else
39 pObject = p
[195]40 End If
[309]41 capacity = newSize
[195]42 End Sub
43
44 Sub SetLeastCapacity( capacity As Long )
45 If This.capacity < capacity Then
[203]46 Realloc(capacity)
[195]47 End If
48 End Sub
49
[118]50Public
[195]51
52 '----------------------------------------------------------------
[118]53 ' Properties
[195]54 '----------------------------------------------------------------
55
[118]56 /*Const*/ Virtual Function Capacity() As Long
[195]57 Return capacity
[118]58 End Function
59
60 Virtual Sub Capacity(c As Long)
[195]61 If c <> capacity Then
62 If c < size Then
[118]63 'Throw ArgumentOutOfRangeException
64 Debug
65 Else
[195]66 Realloc(c)
[118]67 End If
68 End If
69 End Sub
70
71 /*Const*/ /*Override*/ Virtual Function Count() As Long
[195]72 Return size
[118]73 End Function
74
75 /*Const*/ Override Function IsFixedSize() As Boolean
76 Return False
77 End Function
78
79 /*Const*/ Override Function IsReadOnly() As Boolean
80 Return False
81 End Function
82
83 /*Const*/ /*Override*/ Virtual Function IsSynchronized() As Boolean
84 Return False
85 End Function
86 ' SyncRoot
87
88 ' Operators
[195]89 /*Const*/ /*Override*/ Virtual Function Operator [](index As Long) As Object
90 If 0 <= index And index < size Then
91 Return pObject[index]
[118]92 Else
93 'Throw OutOfRangeException?
94 Debug
95 End If
96 End Function
97
[195]98 /*Override*/ Virtual Sub Operator []=(index As Long, object As Object)
99 If 0 <= index And index < size Then
[203]100 pObject[index] = object
[118]101 Else
102 'Throw OutOfRangeException?
103 Debug
104 End If
105 End Sub
106
[195]107
108
109 '----------------------------------------------------------------
[118]110 ' Methods
[195]111 '----------------------------------------------------------------
112
[118]113 ' Constractors
[188]114 Sub ArrayList()
[309]115 Init( 16 )
[118]116 End Sub
117/*
[203]118 Sub ArrayList(c As ICollection)
[118]119 ' 未実装
120 Debug
121 End Sub
122*/
123 Sub ArrayList(c As Long)
[195]124 Init( c )
[118]125 End Sub
126
127 ' Destractor
128 Virtual Sub ~ArrayList()
129 End Sub
130
[203]131' Sub Operator =(a As ArrayList)
[118]132
[195]133 /*Override*/ Virtual Function Add( object As Object ) As Long
134 SetLeastCapacity( size + 1 )
135 pObject[size] = object
[309]136 Add = size
[195]137 size++
[118]138 End Function
139
[203]140 Virtual Sub AddRange(c As ICollection)
[118]141 ' TODO: 実装
142 End Sub
143
[203]144 Const Virtual Function BinarySearch(x As Object)
[118]145 ' TODO: 実装
146 End Function
147
[203]148 Const Virtual Function BinarySearch(x As Object, c As IComparer) As Long
149 Return BinarySearch(0, size, x, c)
[118]150 End Function
151
[203]152 Const Virtual Function BinarySearch(index As Long, count As Long, x As Object, c As IComparer) As Long
153 Dim l = index
154 Dim r = index + ELM(count)
155 While l <= r
156 Dim mid = (l + r) >> 2
157 Dim ret = c.Compare(pObject[mid], x)
158 If ret = 0 Then
159 Return mid
160 Else If ret < 0 Then 'pObject[mid] < x
161 If l = r Then
162 If mid + 1 <= index + ELM(count) Then
163 Return Not (mid + 1)
164 Else
165 Return count
166 End If
167 End If
168 l = mid + 1
169 Else 'pObject[mid] > x
170 If l = r And mid + 1 <= index + ELM(count) Then
171 Return Not mid
172 End If
173 r = mid - 1
174 End If
175 Wend
176 If l = index Then
177 Return Not index
178 Else 'r = index + ELM(count)
179 Return Not count
180 End If
[118]181 End Function
182
183 /*Override*/ Virtual Sub Clear()
[195]184 size = 0
[118]185 End Sub
186
[195]187 Virtual Function Clone() As ArrayList
188 Dim arrayList = New ArrayList( size )
189 memcpy( arrayList.pObject, This.pObject, SizeOf(*Object) * size )
[309]190 arrayList.size = This.size
[195]191 Return arrayList
[118]192 End Function
193
[188]194 /*Const*/ /*Override*/ /*Virtual Function Contains(x As *Object) As Boolean
[118]195 Dim i As Long
[195]196 For i = 0 To ELM(size)
[118]197 If x->Equals(data.Elm[i]) Then
198 Return True
199 End If
200 Next
[188]201 End Function*/
[118]202
203 ' CopyTo
204
[203]205'
206' /*Const*/ /*Override*/ Virtual Function GetEnumerator() As IEnumerator
207' 'Return GetEnumerator(index, count)
208' End Function
[118]209
[203]210' Const Virtual Function GetEnumerator(index As Long, count As Long) As IEnumerator
211' ' TODO: 実装
212' End Function
213
214 Virtual Function GetRange(index As Long, count As Long) As ArrayList
[118]215 ' TODO: 実装
216 End Function
217
[195]218 /*Const*/ Override Function IndexOf(object As Object) As Long
219 Return IndexOf(object, 0, size)
[118]220 End Function
221
[195]222 /*Const*/ Virtual Function IndexOf(object As Object, startIndex As Long) As Long
223 Return IndexOf(object, startIndex, size - startIndex)
[118]224 End Function
225
[195]226 /*Const*/ Virtual Function IndexOf(object As Object, startIndex As Long, count As Long) As Long
[118]227 Dim i As Long
[271]228 Dim last = System.Math.Min(startIndex + count - 1, size)
[118]229 For i = startIndex To last
[195]230 If object.Equals( pObject[i] ) Then
[118]231 Return i
232 End If
233 Next
[195]234 Return -1
[118]235 End Function
236
[195]237 Override Sub Insert(i As Long, object As Object)
238 SetLeastCapacity(size + 1)
239 memmove(VarPtr(pObject[i + 1]), VarPtr(pObject[i]), SizeOf (*Object) * (size - i))
240 pObject[i] = object
241 size++
[118]242 End Sub
243
[203]244 Virtual Sub InsertRange(index As Long, c As ICollection)
[118]245 ' TODO: 実装
246 End Sub
247
[195]248 /*Const*/ Virtual Function LastIndexOf(object As Object) As Long
249 LastIndexOf(object, 0, size)
[118]250 End Function
251
[195]252 /*Const*/ Virtual Function LastIndexOf(object As Object, startIndex As Long) As Long
253 Return LastIndexOf(object, startIndex, size - startIndex)
[118]254 End Function
255
[195]256 /*Const*/ Virtual Function LastIndexOf(object As Object, startIndex As Long, count As Long) As Long
[118]257 ' TODO: 実装
258 End Function
259
[195]260 Override Sub Remove(object As Object)
261 Dim i = IndexOf(object)
[118]262 If i > 0 Then
263 RemoveAt(i)
264 End If
265 End Sub
266
267 Override Sub RemoveAt(i As Long)
268 RemoveRange(i, 1)
269 End Sub
270
271 Virtual Sub RemoveRange(i As Long, count As Long)
272 Dim removeLastPos = i + count
[195]273 memmove(VarPtr(pObject[i]), VarPtr(pObject[removeLastPos]), SizeOf(*Object) * (size - removeLastPos))
274 size -= count
[118]275 End Sub
276
277 Virtual Sub Reverse()
[195]278 Reverse(0, size)
[118]279 End Sub
280
281 Virtual Sub Reverse(startIndex As Long, count As Long)
282 ' TODO: 実装
283 End Sub
284
[203]285 Virtual Sub SetRange(index As Long, c As ICollection)
[118]286 ' TODO: 実装
287 End Sub
288
289 Virtual Sub Sort()
290 ' TODO: 実装
291 End Sub
292
[203]293 Virtual Sub Sort(c As IComparer)
[195]294 Sort(0, size, c)
[118]295 End Sub
296
[203]297 Virtual Sub Sort(index As Long, count As Long, c As IComparer)
[118]298 ' TODO: 実装
299 End Sub
300
301 ' ToArray
302 Virtual Sub TrimToSize()
[195]303 Realloc(size)
[118]304 End Sub
305
[207]306 /*Override*/ Override Function ToString() As String
[118]307 Return "System.Collections.ArrayList"
308 End Function
309
310 ' --------------------------------
311 ' static methods
[203]312 Static Function Adapter(l As IList) As ArrayList
[118]313 ' TODO: 実装
314 End Function
315
[203]316 Static Function FixedSize(l As ArrayList) As ArrayList
[118]317 ' TODO: 実装
318 End Function
319
[203]320 Static Function FixedSize(l As IList) As IList
[291]321 ' TODO: 実装
322 'Return FixedSize(Adapter(l))
[118]323 End Function
324
[203]325 Static Function ReadOnly(l As ArrayList) As ArrayList
[118]326 ' TODO: 実装
327 End Function
328
[203]329 Static Function ReadOnly(l As IList) As IList
[291]330 ' TODO: 実装
331 'Return ReadOnly(Adapter(l))
[118]332 End Function
333
[203]334 Static Function Repeat(x As Object, c As Long) As ArrayList
[118]335 Repeat = New ArrayList(c)
336 Dim i As Long
337 For i = 0 To ELM(c)
[309]338 Repeat.Add(x)
[118]339 Next
340 End Function
341
[203]342 Static Function Synchronized(l As ArrayList) As ArrayList
[118]343 ' TODO: 実装
344 End Function
345
[203]346 Static Function Synchronized(l As IList) As IList
[291]347 ' TODO: 実装
348 'Return Synchronized(Adapter(l))
[118]349 End Function
350
351End Class
352
[195]353/*
[118]354Class ArrayList_Element
355Public
[188]356 Sub ArrayList_Element()
357 Init(0)
358 End Sub
[118]359 Sub ArrayList_Element(c As Long)
[188]360 Init(c)
361 End Sub
362
363 Sub ~ArrayList_Element()
364 free(Elm)
365 End Sub
366
367 Sub Init(c As Long)
[118]368 If c > 0 Then
369 Elm = malloc(SizeOf (*Object) * c)
370 If Elm = 0 Then
371 ' OutOfMemoryException
372 Debug
373 End If
374 Else
375 Elm = 0
376 End If
377 Size = 0
378 Capacity = c
379 End Sub
380
381 Sub Swap(ByRef x As ArrayList_Element)
382 Dim tmpElm = x.Elm
383 x.Elm = This.Elm
384 This.Elm = tmpElm
385
386 Dim tmpSize = x.Size
387 x.Size = This.Size
388 This.Size = x.Size
389
390 Dim tmpCap = x.Capacity
391 x.Capacity = This.Capacity
392 This.Capacity = tmpCap
393 End Sub
394
395 Elm As **Object
396 Size As Long
397 Capacity As Long
[195]398End Class
399*/
Note: See TracBrowser for help on using the repository browser.