source: trunk/ab5.0/ablib/src/Classes/System/Collections/ArrayList.ab@ 582

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

非Genericコレクションインタフェースの扱いを大幅に縮小。Queue/Stackの実装インタフェースの修正。

File size: 6.6 KB
Line 
1' Classes/System/Collections/ArrayList.ab
2
3Namespace System
4Namespace Collections
5
6Class ArrayList
7 'Implements IList /*, ICollection, IEnumerable, ICloneable*/
8
9 pObject As *Object
10 size As Long
11 capacity As Long
12
13 Sub Init( capacity As Long )
14 If size < 0 Then
15 ' Error
16 debug
17 End If
18
19 This.size = 0
20 This.capacity = size
21
22 pObject = GC_malloc( SizeOf(*Object) * size )
23 If pObject = 0 Then
24 ' OutOfMemoryException
25 Debug
26 End If
27 End Sub
28
29 Sub Realloc( newSize As Long )
30' If newSize > capacity Then
31' ' miss!
32' Debug
33' End If
34
35 Dim p = realloc( pObject, SizeOf(*Object) * newSize )
36 If p = 0 Then
37 ' OutOfMemoryException
38 Debug
39 Else
40 pObject = p
41 End If
42 capacity = newSize
43 End Sub
44
45 Sub SetLeastCapacity( capacity As Long )
46 If This.capacity < capacity Then
47 Realloc(capacity)
48 End If
49 End Sub
50
51Public
52
53 '----------------------------------------------------------------
54 ' Properties
55 '----------------------------------------------------------------
56
57 /*Const*/ Virtual Function Capacity() As Long
58 Return capacity
59 End Function
60
61 Virtual Sub Capacity(c As Long)
62 If c <> capacity Then
63 If c < size Then
64 'Throw ArgumentOutOfRangeException
65 Debug
66 Else
67 Realloc(c)
68 End If
69 End If
70 End Sub
71
72 /*Const*/ /*Override*/ Virtual Function Count() As Long
73 Return size
74 End Function
75
76 /*Const*/ Function IsFixedSize() As Boolean
77 Return False
78 End Function
79
80 /*Const*/ Function IsReadOnly() As Boolean
81 Return False
82 End Function
83
84 /*Const*/ /*Override*/ Virtual Function IsSynchronized() As Boolean
85 Return False
86 End Function
87 ' SyncRoot
88
89 ' Operators
90 /*Const*/ /*Override*/ Virtual Function Operator [](index As Long) As Object
91 If 0 <= index And index < size Then
92 Return pObject[index]
93 Else
94 'Throw OutOfRangeException?
95 Debug
96 End If
97 End Function
98
99 /*Override*/ Virtual Sub Operator []=(index As Long, object As Object)
100 If 0 <= index And index < size Then
101 pObject[index] = object
102 Else
103 'Throw OutOfRangeException?
104 Debug
105 End If
106 End Sub
107
108
109
110 '----------------------------------------------------------------
111 ' Methods
112 '----------------------------------------------------------------
113
114 ' Constractors
115 Sub ArrayList()
116 Init( 16 )
117 End Sub
118/*
119 Sub ArrayList(c As ICollection)
120 ' 未実装
121 Debug
122 End Sub
123*/
124 Sub ArrayList(c As Long)
125 Init( c )
126 End Sub
127
128 ' Destractor
129 Virtual Sub ~ArrayList()
130 End Sub
131
132' Sub Operator =(a As ArrayList)
133
134 /*Override*/ Virtual Function Add( object As Object ) As Long
135 SetLeastCapacity( size + 1 )
136 pObject[size] = object
137 Add = size
138 size++
139 End Function
140/*
141 Const Virtual Function BinarySearch(x As Object) As Long
142 ' TODO: 実装
143 End Function
144
145 Const Virtual Function BinarySearch(x As Object, c As IComparer) As Long
146 Return BinarySearch(0, size, x, c)
147 End Function
148
149 Const Virtual Function BinarySearch(index As Long, count As Long, x As Object, c As IComparer) As Long
150 Dim l = index
151 Dim r = index + ELM(count)
152 While l <= r
153 Dim mid = (l + r) >> 2
154 Dim ret = c.Compare(pObject[mid], x)
155 If ret = 0 Then
156 Return mid
157 Else If ret < 0 Then 'pObject[mid] < x
158 If l = r Then
159 If mid + 1 <= index + ELM(count) Then
160 Return Not (mid + 1)
161 Else
162 Return count
163 End If
164 End If
165 l = mid + 1
166 Else 'pObject[mid] > x
167 If l = r And mid + 1 <= index + ELM(count) Then
168 Return Not mid
169 End If
170 r = mid - 1
171 End If
172 Wend
173 If l = index Then
174 Return Not index
175 Else 'r = index + ELM(count)
176 Return Not count
177 End If
178 End Function
179*/
180 /*Override*/ Virtual Sub Clear()
181 size = 0
182 End Sub
183
184 Virtual Function Clone() As ArrayList
185 Dim arrayList = New ArrayList( size )
186 memcpy( arrayList.pObject, This.pObject, SizeOf(*Object) * size )
187 arrayList.size = This.size
188 Return arrayList
189 End Function
190
191 /*Const*/ /*Override*/ /*Virtual Function Contains(x As *Object) As Boolean
192 Dim i As Long
193 For i = 0 To ELM(size)
194 If x->Equals(data.Elm[i]) Then
195 Return True
196 End If
197 Next
198 End Function*/
199
200 ' CopyTo
201
202'
203' /*Const*/ /*Override*/ Virtual Function GetEnumerator() As IEnumerator
204' 'Return GetEnumerator(index, count)
205' End Function
206
207' Const Virtual Function GetEnumerator(index As Long, count As Long) As IEnumerator
208' ' TODO: 実装
209' End Function
210
211 Virtual Function GetRange(index As Long, count As Long) As ArrayList
212 ' TODO: 実装
213 End Function
214
215 /*Const*/ Function IndexOf(object As Object) As Long
216 Return IndexOf(object, 0, size)
217 End Function
218
219 /*Const*/ Virtual Function IndexOf(object As Object, startIndex As Long) As Long
220 Return IndexOf(object, startIndex, size - startIndex)
221 End Function
222
223 /*Const*/ Virtual Function IndexOf(object As Object, startIndex As Long, count As Long) As Long
224 Dim i As Long
225 Dim last = System.Math.Min(startIndex + count - 1, size)
226 For i = startIndex To last
227 If object.Equals( pObject[i] ) Then
228 Return i
229 End If
230 Next
231 Return -1
232 End Function
233
234 Sub Insert(i As Long, object As Object)
235 SetLeastCapacity(size + 1)
236 memmove(VarPtr(pObject[i + 1]), VarPtr(pObject[i]), SizeOf (*Object) * (size - i))
237 pObject[i] = object
238 size++
239 End Sub
240
241 /*Const*/ Virtual Function LastIndexOf(object As Object) As Long
242 LastIndexOf(object, 0, size)
243 End Function
244
245 /*Const*/ Virtual Function LastIndexOf(object As Object, startIndex As Long) As Long
246 Return LastIndexOf(object, startIndex, size - startIndex)
247 End Function
248
249 /*Const*/ Virtual Function LastIndexOf(object As Object, startIndex As Long, count As Long) As Long
250 ' TODO: 実装
251 End Function
252
253 Sub Remove(object As Object)
254 Dim i = IndexOf(object)
255 If i > 0 Then
256 RemoveAt(i)
257 End If
258 End Sub
259
260 Sub RemoveAt(i As Long)
261 RemoveRange(i, 1)
262 End Sub
263
264 Virtual Sub RemoveRange(i As Long, count As Long)
265 Dim removeLastPos = i + count
266 memmove(VarPtr(pObject[i]), VarPtr(pObject[removeLastPos]), SizeOf(*Object) * (size - removeLastPos))
267 size -= count
268 End Sub
269
270 Virtual Sub Reverse()
271 Reverse(0, size)
272 End Sub
273
274 Virtual Sub Reverse(startIndex As Long, count As Long)
275 ' TODO: 実装
276 End Sub
277
278 Virtual Sub Sort()
279 ' TODO: 実装
280 End Sub
281
282 ' ToArray
283 Virtual Sub TrimToSize()
284 Realloc(size)
285 End Sub
286
287 Override Function ToString() As String
288 Return "System.Collections.ArrayList"
289 End Function
290
291 Static Function Repeat(x As Object, c As Long) As ArrayList
292 Repeat = New ArrayList(c)
293 Dim i As Long
294 For i = 0 To ELM(c)
295 Repeat.Add(x)
296 Next
297 End Function
298End Class
299
300End Namespace 'Collections
301End Namespace 'System
Note: See TracBrowser for help on using the repository browser.